下面的代码来自《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