线程是轻量级的进程,所有的线程运行于同一个进程中,共享相同的运行环境
Python代码是由Python解释器运行的,实际上解释器中同时只有一个线程在运行,它由全局解释器锁(GIL)来保证这一点。在所有面向I/O的程序来说,GIL会在I/O调用完之前被释放,以允许其他线程在这段等待I/O的时间内运行,故I/O密集型程序更能充分利用多线程的好处。
在python中使用线程有两个module: thread和threading.一般使用更高级别的threading模块:threading模块的同步原语更多,且thread模块对进程什么时候结束完全没有控制。
Threading模块中的Thread类是主要的运行对象,有三种调用它的方法:
a) 创建Thread的实例,传给一个函数
b) 创建Thread的实例,传给一个可调用的类对象
c) 从Thread派生一个子类,创建这个子类的实例
下边只给出第一种调用方法,是python核心编程上边的一个实例:
-
#coding=utf-8
-
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()
另外,用Queue模块可以极其简单的解决生产者-消费者问题。因为queue本身实现了阻塞读和阻塞写,所以只要为读和写各写一个函数,然后构造两个Thread类就好了,具体代码见Python核心编程
阅读(575) | 评论(0) | 转发(0) |