python-Thread之join()的使用 作者:马育民 • 2019-02-21 15:24 • 阅读:10881 # join()的使用 与Process的join()类似,Thread的join()方法,创建并启动子线程后,**让父线程等待**,等子线程执行结束后,父线程才继续执行 **线程阻塞**:这种让线程等待,就叫阻塞 ### join定义 ``` join([timeout]) ``` 让主线程阻塞,直到子线程执行结束后,主线程才往下执行, **参数:** - timeout:指定超时时间,单位:秒, 如果设置1秒,表示主线程等待1秒后,继续执行; 如果不设置,父线程一直等待子线程运行结束后,父线程才继续运行 # 例子 ``` #coding=utf-8 import threading,time import multiprocessing def task(): t=threading.current_thread() print('%s 子线程执行'%t.name) time.sleep(3) if __name__ == "__main__": t1=threading.Thread(target=task) t2=threading.Thread(target=task) t1.start() t2.start() print('主线程--存活线程数量:%d'%threading.active_count()) t1.join() t2.join() print('主线程--存活线程数量:%d'%threading.active_count()) ``` 执行结果: ``` Thread-1 子线程执行 Thread-2 子线程执行 主线程--存活线程数量:3 主线程--存活线程数量:1 最后一行代码 ``` 调用```join()```方法后,主线程会阻塞,直到子线程结束后才会继续执行 # join()的bug 与Process的join()的bug类似,Thread在使用join()时,由于位置不正确也会出现bug 在上面的代码中,17-23行代码是创建并启动线程,25-26行是让子线程join,这种写法是正确的,如果启动线程后立刻调用join()方法,相当于单线程在执行 错误的代码如下: ``` #coding=utf-8 import threading import time import os def task(index): #任务 for index in range(3): #获取当前线程对象 t=threading.current_thread() print('循环name=%s,index=%d'%(t.name,index)) time.sleep(1) if __name__ == "__main__": print('pid=%d'%os.getpid()) threads=[] for index in range(5): #创建线程,并传值 t=threading.Thread(target=task,args=(index,)) threads.append(t) t.start() t.join() #打印线程名 print('启动线程name=%s,传值index=%d'%(t.name,index)) #当所有子线程执行结束后才执行下面代码,存活数是1,是因为只有主线程 print('主线程,存活线程数量=%d'%(threading.active_count())) ``` 执行结果如下图: [![](http://www.malaoshi.top/upload/0/0/1EF2q0sdkYta.png)](http://www.malaoshi.top/upload/0/0/1EF2q0sdkYta.png) 从打印结果可知,一个线程执行结束后,下一个线程才开始执行 ### 解决bug: 如果要调用```join()```方法,不要在循环中创建线程、启动线程,然后直接调用```join()``` ``` #coding=utf-8 import threading import time import os def task(index): #任务 for index in range(3): #获取当前线程对象 t=threading.current_thread() print('循环name=%s,index=%d'%(t.name,index)) time.sleep(1) if __name__ == "__main__": print('pid=%d'%os.getpid()) threads=[] for index in range(5): #创建线程,并传值 t=threading.Thread(target=task,args=(index,)) threads.append(t) t.start() #打印线程名 print('启动线程name=%s,传值index=%d'%(t.name,index)) for item in threads: item.join() #当所有子线程执行结束后才执行下面代码,存活数是1,是因为只有主线程 print('主线程,存活线程数量=%d'%(threading.active_count())) ``` 原文出处:http://malaoshi.top/show_1EF2pzkMsCA5.html