join方法的作用是同步线程。
1、不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退出。
def print_number(num): print("-----> %d" % num, time.ctime()) time.sleep(5) print("print_number ending......", time.ctime()) def print_letter(letter): print("-----> %s" % letter, time.ctime()) time.sleep(10) print("print_letter ending......", time.ctime()) t1 = threading.Thread(target=print_number,args=(10,)) t2 = threading.Thread(target=print_letter,args=('hello',)) if __name__ == '__main__': t1.start() t2.start() print("Main thread ended...")
显示结果如下:
-----> 10 Wed Mar 20 09:22:30 2019 -----> hello Wed Mar 20 09:22:30 2019 Main thread ended... print_number ending...... Wed Mar 20 09:22:35 2019 print_letter ending...... Wed Mar 20 09:22:40 2019 ***Repl Closed***
可以看到主线程、t1、t2同时开始执行,主线程仅打印了“Main thread ended...”,就执行完毕并退出;而程序等待t1和t2执行完毕后才退出。
2、使用join()方法:主线程主线程任务结束之后,进入阻塞状态,一直等待调用join方法的子线程执行结束之后,主线程才会终止。下面的例子是让t1调用join()方法。
import threading import time def print_number(num): print("-----> %d" % num, time.ctime()) time.sleep(5) print("print_number ending......", time.ctime()) def print_letter(letter): print("-----> %s" % letter, time.ctime()) time.sleep(10) print("print_letter ending......", time.ctime()) t1 = threading.Thread(target=print_number,args=(10,)) t2 = threading.Thread(target=print_letter,args=('hello',)) if __name__ == '__main__': t1.start() t2.start() t1.join() print("Main thread ended...")
程序运行结果如下:
-----> 10 Wed Mar 20 09:20:59 2019 -----> hello Wed Mar 20 09:20:59 2019 print_number ending...... Wed Mar 20 09:21:04 2019 Main thread ended... print_letter ending...... Wed Mar 20 09:21:09 2019 ***Repl Closed***
可以看到与无join方法时的输出顺序明显不同。t1、t2同时启动。而t1的时间短,因此在5秒钟之后该线程执行完毕。由于t1.join(),主线程在执行时,在调用t1.join()方法的地方被阻塞了,在此处一直等待t1执行结束,主线程才会执行最后一行代码。