使用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
上一篇下一篇

猜你喜欢

热点阅读