1. 程式人生 > >單線程和多線程執行對比—Python多線程編程

單線程和多線程執行對比—Python多線程編程

func __main__ nta one tin del don elf ces

單線程和多線程執行對比

本章使用遞歸求斐波那契、階乘與累加函數的執行來對比單線程與多線程;

斐波那契、階乘與累加(mtfacfib.py):

?
 1 import threading
 2 from time import sleep, ctime
 3 ?
 4 class MyThread(threading.Thread):
 5     def __init__(self, func, args, name=‘‘):
 6         threading.Thread.__init__(self)
 7         self.name = name
 8         self.func = func
9 self.args = args 10 ? 11 def getResult(self): 12 return self.res 13 ? 14 def run(self): 15 print(starting %s at:%s % (self.name, ctime())) 16 self.res = self.func(*self.args) 17 print(%s finished at:%s % (self.name, ctime())) 18 ? 19 ? 20 def fib(x):
21 sleep(0.005) 22 if x < 2: 23 return 1 24 return (fib(x-2) + fib(x-1)) 25 ? 26 def fac(x): 27 sleep(0.1) 28 if x < 2: 29 return 1 30 return (x * fac(x-1)) 31 ? 32 def sum(x): 33 sleep(0.1) 34 if x < 2: 35 return 1 36 return (x + sum(x-1))
37 ? 38 funcs = [fib, fac, sum] 39 n = 12 40 ? 41 def main(): 42 nfuncs = range(len(funcs)) 43 ? 44 print(*** SINGLE THREAD) 45 for i in nfuncs: 46 print(starting %s at:%s % (funcs[i].__name__, ctime())) 47 print(funcs[i](n)) 48 print(%s finished at:%s % (funcs[i].__name__, ctime())) 49 ? 50 print(\n*** MULTIPLE THREADS) 51 threads = [] 52 for i in nfuncs: 53 t = MyThread(funcs[i], (n,), funcs[i].__name__) 54 threads.append(t) 55 ? 56 for i in nfuncs: 57 threads[i].start() 58 ? 59 for i in nfuncs: 60 threads[i].join() 61 print(threads[i].getResult()) 62 ? 63 print(all Done) 64 ? 65 if __name__ == __main__: 66 main()

 

輸出結果為:

 1 E:\Project\Test_Temporary>python mtfacfib.py
 2 *** SINGLE THREAD
 3 starting fib at:Fri Jul 27 08:53:18 2018
 4 233
 5 fib finished at:Fri Jul 27 08:53:20 2018
 6 starting fac at:Fri Jul 27 08:53:20 2018
 7 479001600
 8 fac finished at:Fri Jul 27 08:53:22 2018
 9 starting sum at:Fri Jul 27 08:53:22 2018
10 78
11 sum finished at:Fri Jul 27 08:53:23 2018
12 ?
13 *** MULTIPLE THREADS
14 starting fib at:Fri Jul 27 08:53:23 2018
15 starting fac at:Fri Jul 27 08:53:23 2018
16 starting sum at:Fri Jul 27 08:53:23 2018
17 fac finished at:Fri Jul 27 08:53:24 2018
18 sum finished at:Fri Jul 27 08:53:24 2018
19 fib finished at:Fri Jul 27 08:53:25 2018
20 233
21 479001600
22 78
23 all Done

  • 以單線程運行時,只是簡單的依次調用每個函數,並在函數執行結束後立即顯示相應結果;

  • 以多線程模式運行時,不會立即顯示結果,而是等線程都結束後再調用 getResult() 方法來最終顯示每個函數的返回值。

單線程和多線程執行對比—Python多線程編程