zoukankan      html  css  js  c++  java
  • Python多进程的Join和daemon(守护)的用法

    join和daemon

    下面仅以多进程为例:

    知识点一:

    当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面一。

    知识点二:

    当我们使用setDaemon(True)方法,也就是设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面二。

    知识点三:

    此时join的作用就凸显出来了,join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止,例子见下面三。

    知识点四:

    join有一个timeout参数: 当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序。所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和。简单的来说,就是给每个子线程一个timeout的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。 没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

    设置daemon:

    import threading
    import time
     
    def run():
     
        time.sleep(2)
        print('当前线程的名字是: ', threading.current_thread().name)
        time.sleep(2)
     
     
    if __name__ == '__main__':
     
        start_time = time.time()
     
        print('这是主线程:', threading.current_thread().name)
        thread_list = []
        for i in range(5):
            t = threading.Thread(target=run)
            thread_list.append(t)
     
        for t in thread_list:
            t.setDaemon(True)
            t.start()
     
        print('主线程结束了!' , threading.current_thread().name)
        print('一共用时:', time.time()-start_time)

    运行结果如下:

    非常明显的看到,主线程结束以后,子线程还没有来得及执行,整个程序就退出了。

    设置join

     1 # join
     2 import threading
     3 import time
     4 
     5 
     6 def run():
     7     time.sleep(2)
     8     print('当前线程的名字是: ', threading.current_thread().name)
     9     time.sleep(2)
    10 
    11 
    12 if __name__ == '__main__':
    13 
    14     start_time = time.time()
    15 
    16     print('这是主线程:', threading.current_thread().name)
    17     thread_list = []
    18     for i in range(5):
    19         t = threading.Thread(target=run)
    20         thread_list.append(t)
    21 
    22     for t in thread_list:
    23         t.setDaemon(True)
    24         t.start()
    25 
    26     for t in thread_list:
    27         t.join()
    28 
    29     print('主线程结束了!', threading.current_thread().name)
    30     print('一共用时:', time.time() - start_time)
    31 # https://www.cnblogs.com/kujiawei

    运行结果如下:

    可以看到,主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。

  • 相关阅读:
    LeetCode 121. Best Time to Buy and Sell Stock
    LeetCode 221. Maximal Square
    LeetCode 152. Maximum Product Subarray
    LeetCode 53. Maximum Subarray
    LeetCode 91. Decode Ways
    LeetCode 64. Minimum Path Sum
    LeetCode 264. Ugly Number II
    LeetCode 263. Ugly Number
    LeetCode 50. Pow(x, n)
    LeetCode 279. Perfect Squares
  • 原文地址:https://www.cnblogs.com/kujiawei/p/10601823.html
Copyright © 2011-2022 走看看