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

    运行结果如下:

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

  • 相关阅读:
    PythonStudy——格式化输入小练习
    PythonStudy——运算符优先级 Operator precedence
    PythonStudy——逻辑运算符 Logical Operators
    ExtJS动态创建组件
    常见报表的JS代码
    sqlserver学习
    读写分离与锁分离
    oracle链接原理
    读java并发编程笔记
    日志机制在编程中的作用
  • 原文地址:https://www.cnblogs.com/kujiawei/p/10601823.html
Copyright © 2011-2022 走看看