Python 线程 threading

本文介绍Python threading模块中的守护线程概念,通过setDaemon()设置线程daemon标志控制主线程是否等待子线程。同时讲解join()方法及timeout参数,以及主线程在所有非守护线程退出后才结束的机制。包含代码示例演示线程创建与join等待。

作者:zhuge···预计阅读 10 分钟·642 阅读·0 评论

    threading模块支持守护线程,守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求,就一直等着。如果设定一个线程为守护线程,就表示这个线程不重要,在进程退出时,不用等待这个线程退出。如果主线程退出时不用等待子线程完成,就要设定这些线程的daemon属性,即在线程Thread.start()开始前,调用setDaemon()函数设定线程的daemon标志(Thread.setDaemon(True)),表示这个线程“不重要”。如果一定要等待子线程执行完成再退出主线程,就什么都不用做或显式调用Thread.setDaemon(False)以保证daemon标志为False,可以调用Thread.isDaemon()函数判断daemon标志的值。新的子线程会继承父线程的daemon标志,主线程在所有非守护线程退出后才会结束,即进程中没有非守护线程存在时才结束。

    join()还可以设置timeout参数,即主线程的超时时间。join()另一个比较重要的方面是可以完全不用调用。一旦线程启动,就会一直运行,直到线程的函数结束并退出为止。如果主线程除了等线程结束外,还有其他事情要做,就不用调用join(),只有在等待线程结束时才调用。


import threading
from time import sleep
from datetime import datetime

def get_date_str(dt):     return datetime.strftime(dt, '%Y-%m-%d %H-%M-%S') def subthread(thid, sec):     print(f'subthread-线程{thid},Start at {get_date_str(datetime.now())} ,sleep{sec} s')     sleep(sec)     print(f'subthread-线程{thid},End at {get_date_str(datetime.now())} ,sleep{sec} s') def subthread2(thid, sec):     print(f'subthread2-线程{thid},Start at {get_date_str(datetime.now())} ,sleep{sec} s')     sleep(sec)     print(f'subthread2-线程{thid},End at {get_date_str(datetime.now())} ,sleep{sec} s') def main():     print('-'  10 + 'ALL START:' + get_date_str(datetime.now()) + '-'  10)     threads = []     loops = [4, 2,2]     thread_count=range(len(loops))     for i in thread_count:         if i < 2:             threads.append(threading.Thread(target=subthread,args=(i,loops[i])))         else:             threads.append(threading.Thread(target=subthread2, args=(i, loops[i])))

    for i in thread_count:         threads[i].start()     for i in thread_count:         threads[i].join()  # 线程全部结束之后主线程才会退出     print('-'  10 + 'ALL End:' + get_date_str(datetime.now()) + '-'  10)

if name=='main':     main()


相关文章

评论

加载中...