使用threading模块
2017-03-29 本文已影响11人
CaesarsTesla
#!/usr/bin/env python
#-*- coding:utf-8 -*-
#@Filename:mtsleepC
#@Date:2017-03-29 21:58
#@auther:Mudy
#@E-mail:2808050775@qq.com
#@Blog:txmudy.cn
import threading
from time import sleep,ctime
loops = [4,2]
def loop(nloop,nsec):#需要的两个参数
print("start loop",nloop,"at:",ctime())
sleep(nsec)
print("loop",nloop,"done at:",ctime())
def main():
print("starting at:",ctime())
threads = []
nloops = range(len(loops)) #[0,1]
for i in nloops:
t = threading.Thread(target=loop,args=(i,loops[i]))
threads.append(t)
for i in nloops:
threads[i].start()#开始一个新的线程
for i in nloops:
threads[i].join()#等待所有的线程结束
print('all done at ',ctime())
if __name__ == "__main__":
main()
输出的结果是:
starting at: Wed Mar 29 22:11:19 2017
start loop 0 at: Wed Mar 29 22:11:19 2017
start loop 1 at: Wed Mar 29 22:11:19 2017
loop 1 done at: Wed Mar 29 22:11:21 2017
loop 0 done at: Wed Mar 29 22:11:23 2017
all done at Wed Mar 29 22:11:23 2017
实例化Thread(调用Thread())和调用thread.start_new_thread()的最大的区别是新线程不会立即开始执行.这是一个非常有用的同步功能,尤其是当你并不希望线程立即开始执行时。
当所有线程都分配完成之后,通过调用每个线程的start()方法让他们开始执行
,而不是在这之前就会执行。相比于管理一组锁(分配、获取、释放、检查锁状态等)而言,这里只要为每个线程调用join()方法即可。join()方法将等待线程结束。或者在提供了超时时间的情况下,达到超时时间。使用join()方法要比等待锁释放的无限循环更加清晰(这也是这种锁又称为自旋锁的原因
)
对于调用join()方法而言,其另一个重要方面是其实它根本不需要调用。一旦线程启动,他们就会一直执行,直到给定的函数完成后退出。如果线程还有其他事情要去做,而不是等待这些线程完成(例如其他处理或者等待新的客户端请求),就可以不调用join()。join()方法只有在你需要等待线程完成的时候在是有用的
如果不调用join()
starting at: Wed Mar 29 22:28:22 2017
start loop 0 at: Wed Mar 29 22:28:22 2017
start loop 1 at: Wed Mar 29 22:28:22 2017
all done at Wed Mar 29 22:28:22 2017
loop 1 done at: Wed Mar 29 22:28:24 2017
loop 0 done at: Wed Mar 29 22:28:26 2017