下面的代码来自《Python核心编程》(第二版)一书。
threading模块对象 | 说明 |
Thread | 表示一个线程的执行的对象 |
Lock | 锁原语对象(跟thread模块里的锁原语对象相同) |
RLock | 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定) |
Condition | 条件变量对象能让一个线程停下来,等待其他线程满足了某个“条件”。如,状态的改变或值得改变 |
Event | 通用的条件变量,多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活 |
Semaphore | 为等待锁的线程提供一个类似“等候室”的结构 |
BoundedSemaphore | 与Semaphore类似,只是它不允许超过初始值 |
Timer | 与Thread相似,只是它要等待一段时间后才开始运行 |
用Thread类,我们可以用多种方法来创建线程。一般有三种常见的方法,分别为:
+ 创建一个Thread的实例,传给它一个函数
+ 创建一个Thread的实例,传给它一个可调用的类对象
+ 从Thread派生出一个子类,创建一个这个子类的实例
# cat mtsleep3.py #!/usr/bin/env python 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)) 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()
所有的线程都创建了之后,再一起调用start()函数启动,而不是创建一个启动一个。而且,不用再管理一堆锁(分配锁、获得锁、释放锁、检查锁的状态等),只要简单地对每个线程调用join()函数就可以了。join()函数会等到线程结束,或者在给了timeout参数的时候,等到超时为止。
运行结果为:
# python mtsleep3.py starting at: Wed Sep 23 09:12:48 2015 start loop 0 at: Wed Sep 23 09:12:48 2015 start loop 1 at: Wed Sep 23 09:12:48 2015 loop 1 done at: Wed Sep 23 09:12:50 2015 loop 0 done at: Wed Sep 23 09:12:52 2015 all DONE at: Wed Sep 23 09:12:52 2015