在学习python 多线程编程的时候,一定会使用一个函数join,本章内容通过例子讲述join 在多线程编程中有哪些作用。本文使用两段代码演示其功能代码一import threading, timedef now() :return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )def func1():print 'start func1: ' + now() + "\n"time.sleep(3)print 'stop func1: ' + now() + "\n"def func2():print 'start func2: ' + now() + "\n"time.sleep(5)print 'stop func2: ', now() + "\n"thtsk = []thread1 = threading.Thread(target = func1)thread1.start()thtsk.append(thread1)thread2 = threading.Thread(target = func2)thread2.start()thtsk.append(thread2)print 'start join: ' + now() + "\n"for thd in thtsk:thd.join()print 'end join: ' + now() + "\n"该样例中使用了两个线程thread1,thread2,分别执行func1,func2,其中func1 的动作是打印开始时间,sleep 3s,打印结束时间func2 的动作是打印开始时间,sleep 5s,打印结束时间。后面使用start() 方法同步开始执行两个线程,然后开始循环调用两个线程的join()方法,join不加参数的时候结果如下:
解释:func1 在3s 之后结束,fun2 在5s之后结束,并且最后输出 【end join】代码二import threading, timedef now() :return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )def func1():print 'start func1: ' + now() + "\n"time.sleep(3)print 'stop func1: ' + now() + "\n"def func2():print 'start func2: ' + now() + "\n"time.sleep(8)print 'stop func2: ', now() + "\n"thtsk = []thread1 = threading.Thread(target = func1)thread1.start()thtsk.append(thread1)thread2 = threading.Thread(target = func2)thread2.start()thtsk.append(thread2)print 'start join: ' + now() + "\n"for thd in thtsk:thd.join(2)print 'end join: ' + now() + "\n"在join()函数添加参数 2 ,表示等待两秒,结果如下
解释:两个线程开始并发执行,先执行func1的join(2),等func1执行2s后,执行func2的join(2),等线程2执行2s后,开始执行主进程,打印「end join」,1s之后fun2执行结束。这里join(2)标示2s之后不管当前线程是否执行完成,都会处理下一个线程。总结一下:1 join方法的作用是阻塞主进程无法执行join以后的语句,专注执行多线程,必须等待多线程执行完毕之后才能执行主线程的语句。2 多线程多join的情况下,依次执行各线程的join方法,前一个结束之后,才能执行后一个。3 无参数,则等待到该线程结束,才开始执行下一个线程的join。4 设置参数后,则等待该线程N秒之后不管该线程是否结束,就开始执行后面的主进程。