• PYTHON——多线程:Join&Daemon


    1、setDaemon(True):

          将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦 

    2、join():

           在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

    Join()和Daemon()方法实例:

    import threading
    from time import ctime,sleep
    
    # def music(func):
    #     for i in range(2):
    #         print('I was listening to {},{}'.format(func,ctime()))
    #         sleep(3)
    #         print('End Listen. %s' %ctime())
    # def move(func):
    #     for i in range(2):
    #         print('I was at the %s! %s' %(func,ctime()))
    #         sleep(5)
    #         print('End Move. %s' % ctime())
    #
    # threads = []
    # t1 = threading.Thread(target=music,args=('七里香',))
    # threads.append(t1)
    # t2 = threading.Thread(target=move,args=('阿甘正传',))
    # threads.append(t2)
    #
    # if __name__ == '__main__':
    #     for t in threads:
    #         t.start()
    #     t1.join()
    #     t2.join()
    #     print('all over %s' %ctime())
    '''
        共花了10秒的时间。单线程运行,需要花16秒=(10秒+6秒)
    '''
    
    def music(func):
        print(threading.current_thread())
        for i in range(2):
            print('I was listening to {},{}'.format(func,ctime()))
            sleep(3)
            print('End Listen. %s' %ctime())
    def move(func):
        print(threading.current_thread())
        for i in range(2):
            print('I was at the %s! %s' %(func,ctime()))
            sleep(5)
            print('End Move. %s' % ctime())
    
    threads = []
    t1 = threading.Thread(target=music,args=('七里香',))
    threads.append(t1)
    t2 = threading.Thread(target=move,args=('阿甘正传',))
    threads.append(t2)
    
    if __name__ == '__main__':
        t1.setDaemon(True)
        for t in threads:
            # t.setDaemon(True)    #守护线程:主线程结束,不再等子线程,就结束了
            t.start()
        print(threading.current_thread())
        print(threading.active_count())
        print('all over %s' %ctime())

    3、线程其他方法:

    thread 模块提供的其他方法:
    # threading.currentThread(): 返回当前的线程变量。
    # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
    # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
    # 除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
    # run(): 用以表示线程活动的方法。
    # start():启动线程活动。
    # join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
    # isAlive(): 返回线程是否活动的。
    # getName(): 返回线程名。
    # setName(): 设置线程名。
  • 相关阅读:
    数据结构与算法总结
    Java基础总结
    Android基础之View的绘制原理
    安卓面经汇总
    Elasticsearch7.7.0搭建并集成IK分词器
    Linux&Nginx16_Linux安装软件2
    Linux15_Linux命令2
    Linux&Nginx16_Nginx安装3
    Linux&Nginx16_软件安装方式&上传下载1
    Linux15_Linux修改3
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9908292.html
Copyright © 2020-2023  润新知