下面的代码来自《Python核心编程》(第二版)一书。


threading模块对象
说明
Thread 表示一个线程的执行的对象
Lock 锁原语对象(跟thread模块里的锁原语对象相同)
RLock 可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)
Condition 条件变量对象能让一个线程停下来,等待其他线程满足了某个“条件”。如,状态的改变或值得改变
Event 通用的条件变量,多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活
Semaphore 为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore 与Semaphore类似,只是它不允许超过初始值
Timer 与Thread相似,只是它要等待一段时间后才开始运行


用Thread类,我们可以用多种方法来创建线程。一般有三种常见的方法,分别为:

    + 创建一个Thread的实例,传给它一个函数

    + 创建一个Thread的实例,传给它一个可调用的类对象

    + 从Thread派生出一个子类,创建一个这个子类的实例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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  in  nloops:
         t = threading.Thread(target=loop,
                    args=(i, loops[i]))
         threads.append(t)
 
     for  in  nloops:
         threads[i].start()
 
     for  in  nloops:
         threads[i]. join ()
 
     print  'all DONE at:' , ctime()
 
if  __name__ ==  '__main__' :
     main()

所有的线程都创建了之后,再一起调用start()函数启动,而不是创建一个启动一个。而且,不用再管理一堆锁(分配锁、获得锁、释放锁、检查锁的状态等),只要简单地对每个线程调用join()函数就可以了。join()函数会等到线程结束,或者在给了timeout参数的时候,等到超时为止。


运行结果为:

1
2
3
4
5
6
7
# 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