概述Python多线程和多进程中join()方法的作用是一样的。下面仅以多线程为例。首先需要明确几个概念:A.当一个进程启动时,默认会产生一个主线程,因为线程是程序执行流程的最小单位。设置多线程时,将创建主线程。多个子线程,在python中,默认情况下(实际上是setDaemon(False)),主线程执行完自己的任务后退出,子线程会继续执行自己的任务,直到自己的任务结束。请参阅下面的示例。B、当我们使用setDaemon(True)方法将子线程设置为守护线程时,一旦主线程执行完毕,所有线程都会终止。可能的情况是子线程的任务还没有执行完,强行停止,例子见下面两个。C、这时候join的作用就凸显出来了。join所做的工作是线程同步,即主线程任务结束后,进入阻塞状态,等待其他子线程执行完毕。主线程正在终止。请参见下面的示例三。D.join有一个timeout参数:1.设置守护线程时,表示主线程会在等待子线程超时的时候杀掉子线程,最后退出程序。所以,如果有10个子线程,总的等待时间就是每次超时的累加和。简单点说就是给每个子线程一个超时时间去执行,时间到了不管任务有没有完成都会直接kill掉。2.当没有设置daemon线程时,主线程会等待timeout等时间的累积。时间到了,主线程结束,但是子线程并没有被杀死,子线程仍然可以继续执行,直到子线程全部结束,程序退出。Python多线程的默认情况#!/usr/bin/python#!-*-coding:utf-8-*-importthreadingimporttimeimportsysreload(sys)sys.setdefaultencoding('utf-8')defrun():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=[]foriinrange(5):t=threading.Thread(target=run)thread_list.append(t)fortinthread_list:t.start()print('主线程结束!'+threading.current_thread().name)print('Togethersharedtime:'+str(time.time()-start_time))运行结果如下:[root@OPSwechat]#pythont.py这是主线程:MainThread主线程结束!MainThread共享时间:0.000776052474976当前线程名称为:Thread-1当前线程名称为:Thread-2当前线程名称为:Thread-3当前线程名称为:Thread-4当前线程的名字是:Thread-5[root@OPSwechat]#要点:1、我们的计时是给主线程计时。当主线程结束时,计时结束,打印出主线程所花费的时间。2、主线程的任务完成后,主线程随之结束,子线程继续执行自己的任务,直到子线程的所有任务完成,程序结束。设置守护线程#!/usr/bin/python#!-*-coding:utf-8-*-importthreadingimporttimeimportsysreload(sys)sys.setdefaultencoding('utf-8')defrun():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=[]foriinrange(5):t=threading.Thread(target=run)thread_list.append(t)fortinthread_list:t.setDaemon(True)t.start()print('主线程结束了!'+threading.current_thread().name)print('总分享时间:'+str(time.time()-start_time))执行结果如下,请确保setDaemon()在start().[root@OPSwechat]#pythont.py这是主线程:MainThread主线程结束!MainThreadsharedtime:0.000770092010498重点:很明显,主线程结束后,子线程还没来得及执行,整个程序就退出了。加入#!/usr/bin/python#!的作用-*-coding:utf-8-*-importthreadingimporttimeimportsysreload(sys)sys.setdefaultencoding('utf-8')defrun():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=[]foriinrange(5):t=threading.Thread(target=run)thread_list.append(t)fortinthread_list:t.setDaemon(True)t.start()fortinthread_list:t.join()print('主线程结束!'+threading.current_thread().name)print('总共享时间:'+str(time.time()-start_time))执行结果如下:[root@OPSwechat]#pythont.py这是主线程:MainThread当前线程的名字是:Thread-1当前线程的名字是:Thread-2当前线程的名字是:Thread-3当前线程的名字是:Thread-4当前线程的名字是:Thread-5主线程结束了!MainThread分享时间:4.00501298904文渊网,仅供学习,侵删。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。
