单线程和多线程执行对比

示例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

更多推荐