シングルスレッドとマルチスレッドの比較-Pythonマルチスレッドプログラミング

11522 ワード

単一スレッドとマルチスレッドの比較
本章では、フィボナッチを再帰的に求め、階乗と累積関数の実行を用いて、単一スレッドとマルチスレッドを比較する.
フィボナッチ、階乗と累積(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('
*** 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()メソッドを呼び出して各関数の戻り値を最終的に表示します.