盒子
盒子
Posts List
  1. 一个测试join()函数的程序
  2. 总结

测试多线程中join函数的功能

一个测试join()函数的程序

# coding: utf-8

# 测试多线程中join的功能


import threading, time  

def doWaiting():  
    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "n"  

    time.sleep(3)  

    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "n" 
def doWaiting1():  

    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "n"   

    time.sleep(8)  

    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "n"  

tsk = []    

thread1 = threading.Thread(target = doWaiting)  

thread1.start()  

tsk.append(thread1)

thread2 = threading.Thread(target = doWaiting1)  

thread2.start()  

tsk.append(thread2)

print 'start join: ' + time.strftime('%H:%M:%S') + "n"   

for tt in tsk:

    tt.join()

print 'end join: ' + time.strftime('%H:%M:%S') + "n"    

在join函数不带参数的情况下

运行结果:    
start waiting1: 15:10:11n    
start waiting2: 15:10:11n    
start join: 15:10:11n    
stop waiting1: 15:10:14n    
stop waiting2:  15:10:19n    
end join: 15:10:19n    

可以看到,两个线程并行执行,进程1在3s后结束,进程2在8s后结束,然后回到主进程,执行打印「end join」。

、、、、、、
把参数设置为2,观察运行结果

运行结果:    
start waiting1: 15:40:02n
start waiting2: 15:40:02n
start join: 15:40:02n
stop waiting1: 15:40:05n
end join: 15:40:06n
stop waiting2:  15:40:10n    

可以看到,两个线程开始并发执行,然后执行线程1的join(2),等线程1执行2s后就不管它了,执行线程2的join(2),等线程2执行2s后也不管它了(在此过程中线程1执行结束,打印线程1的结束信息),开始执行主进程,打印「end join」。4s之后线程2执行结束。

总结

当join函数不带参数的时候:join的原理就是依次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束,如果结束则跳转执行下一个线程的join函数。

当join函数设置超时(带有参数)的时候,通过传给join一个参数来设置超时,也就是超过指定时间join就不在阻塞进程。

支持一下
扫一扫,支持forsigner