threading模块是python线程很重要的一个模块,可以简化很多线程的操作,下面是个三个函数计算,可以看到单线程的情况下消耗了5秒钟,多线程的情况下只用了2秒多一点:
'''
Created on 2012-3-9
@author: Administrator
'''
#!/usr/bin/env python
from MyThread import MyThread
from time import ctime,sleep
def fib(x):
sleep(0.005)
if x<2:
return 1
return (fib(x-2)+fib(x-1))
def fac(x):
sleep(0.1)
if x<2:
return 1
return (x*fac(x-1))
def sum(x):
sleep(0.1)
if x<2:
return 1
return (x+sum(x-1))
funcs=[fib,fac,sum]
n=12
def main():
nfuncs = range(len(funcs))
print '*** single thread'
for i in nfuncs:
print 'starting',funcs[i].__name__,'at:',\
ctime()
print funcs[i](n)
print funcs[i].__name__,'done at:',\
ctime()
print '\n*** multiple thread'
threads=[]
for i in nfuncs:
t=MyThread(funcs[i],(n,),funcs[i].__name__)
threads.append(t)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
threads[i].join()
print threads[i].getResult()
print 'all done'
if __name__=='__main__':
main()
运行结果:
*** single thread
starting fib at: Fri Mar 09 17:38:03 2012
233
fib done at: Fri Mar 09 17:38:05 2012
starting fac at: Fri Mar 09 17:38:05 2012
479001600
fac done at: Fri Mar 09 17:38:06 2012
starting sum at: Fri Mar 09 17:38:06 2012
78
sum done at: Fri Mar 09 17:38:08 2012
*** multiple thread
starting fib at: Fri Mar 09 17:38:08 2012
starting fac at: Fri Mar 09 17:38:08 2012
starting sum at: Fri Mar 09 17:38:08 2012
sumfac done at:done at: Fri Mar 09 17:38:09 2012Fri Mar 09 17:38:09 2012
fib done at: Fri Mar 09 17:38:10 2012
233
479001600
78
all done
MyThread的代码如下:
'''
Created on 2012-3-9
@author: Administrator
'''
#!/usr/bin/env python
import threading
from time import ctime
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name=name
self.func=func
self.args=args
def getResult(self):
return self.res
def run(self):
print 'starting',self.name,'at:',\
ctime()
self.res=apply(self.func,self.args)
print self.name,'done at:',\
ctime()