python多线程编程

说起多线程,必然想到了进程、锁等东西,python跟线程有关的模块有thread模块、threading模块、Queue模块、mutex模块、SocketServer模块。thread模块提供了基本的线程和锁的支持,但不建议使用,因为当主线程退出的时候,所有其它线程没有被清除就退出了,而threading模块提供了功能更强的线程管理能力,能确保所有重要的子线程都退出后,进程才结束。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。mutex是个互斥对象,SocketServer具有线程控制的TCP和UDP管理器。

如果用到了thread模块,在start_new_thread创建一个新的线程之前,可能要allocate_lock分配一个LockType类型的锁对象,然后去acquire获取锁对象,创建线程之后,在新线程中做完某些事情就可以release释放锁,通常要在主线程中检查每个线程锁locked状态,当所有锁release之后主线程结束。

threading模块不必像thread模块那样操作锁,只需join使程序挂起即可。threading模块中的Thread类是主要的运行对象,常用的有几种比较相像的用法,如创建Thread实例后传给它一个函数或一个可调用的类对象(可通过apply()实现_ _call__()),或者是从Thread派生一个子类(重写run())并创建这个子类的实例。下面展示一个简单的例子,创建两个线程,Thread实例中传入函数,分别sleep6妙、3妙,主线程显示运行总时间。

#!/usr/bin/env python

import threading
from time import sleep, ctime

loops = [6, 3] # sleep sec

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()

下面是运行结果:
starting at: Tue Jun 9 09:56:32 2015
start loop 0 at: Tue Jun 9 09:56:32 2015
start loop 1 at: Tue Jun 9 09:56:32 2015
loop 1 done at: Tue Jun 9 09:56:35 2015
loop 0 done at: Tue Jun 9 09:56:38 2015
all done at: Tue Jun 9 09:56:38 2015
可以看出,主线程时间为子线程时间较长的那个时间,6秒。

你可能感兴趣的:(python)