Python 多线程编程(单线程和多线程执行对比)
·
单线程和多线程执行对比
示例4-8 的mtfacfib.py 脚本比较了递归求斐波那契、阶乘与累加函数的执行。该脚本按
照单线程的方式运行这三个函数。之后使用多线程的方式执行同样的任务,用来说明多线程
环境的优点。
示例4-8 斐波那契、阶乘与累加(mtfacfib.py)
#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 2
return (x+sum(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__,'finished at:',ctime())
print('\n***MULTIPLE THREADS')
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].getResults())
print('all DONE')
if __name__ == '__main__':
main()
以单线程模式运行时,只是简单地依次调用每个函数,并在函数执行结束后立即显示相
应的结果。
而以多线程模式运行时,并不会立即显示结果。因为我们希望让MyThread 类越通用越
好(有输出和没有输出的调用都能够执行),我们要一直等到所有线程都执行结束,然后调用
getResult()方法来最终显示每个函数的返回值。
因为这些函数执行起来都非常快(也许斐波那契函数除外),所以你会发现在每个函数中
都加入了sleep()调用,用于减慢执行速度,以便让我们看到多线程是如何改善性能的。在实
际工作中,如果确实有不同的执行时间,你肯定不会在其中调用sleep()函数。无论如何,下
面是程序的输出结果。
$ mtfacfib.py
*** SINGLE THREAD
starting fib at: Wed Nov 16 18:52:20 2011
233
fib finished at: Wed Nov 16 18:52:24 2011
starting fac at: Wed Nov 16 18:52:24 2011
479001600
fac finished at: Wed Nov 16 18:52:26 2011
starting sum at: Wed Nov 16 18:52:26 2011
78
sum finished at: Wed Nov 16 18:52:27 2011
*** MULTIPLE THREADS
starting fib at: Wed Nov 16 18:52:27 2011
starting fac at: Wed Nov 16 18:52:27 2011
starting sum at: Wed Nov 16 18:52:27 2011
fac finished at: Wed Nov 16 18:52:28 2011
sum finished at: Wed Nov 16 18:52:28 2011
fib finished at: Wed Nov 16 18:52:31 2011
233
479001600
78
all DONE
更多推荐


所有评论(0)