单线程和多线程执行对比

为了将单线程和多线程执行进行对比,下面的脚本比较了递归求斐波那契、阶乘以及累加函数的操作。该脚本按照单线程的方式运行这三个函数,接着使用多线程的方式执行同样的三个函数,以此来说明多线程环境的优点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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__, 'finished at:', ctime())

print('***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].getResult())

print('all Done')

if __name__ == '__main__':
main()

运行上述代码,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
***single thread
starting fib at: Wed Apr 10 18:23:13 2019
233
fib finished at: Wed Apr 10 18:23:15 2019
starting fac at: Wed Apr 10 18:23:15 2019
479001600
fac finished at: Wed Apr 10 18:23:16 2019
starting sum at: Wed Apr 10 18:23:16 2019
78
sum finished at: Wed Apr 10 18:23:18 2019
***multiple threads
starting fib at: Wed Apr 10 18:23:18 2019
starting fac at: Wed Apr 10 18:23:18 2019
starting sum at: Wed Apr 10 18:23:18 2019
fac finished at: Wed Apr 10 18:23:19 2019
sum finished at: Wed Apr 10 18:23:19 2019
fib finished at: Wed Apr 10 18:23:20 2019
233
479001600
78
all Done

通过上面可以看出,以单线程模式运行只是简单地调用每个函数,并在函数执行结束后立即显示相应的结果。
而以多线程模式运行时,并不会立即显示结果。因为希望让MyThread类越通用越好(即有输出和没有输出的调用都能够执行),我们要一直等到所有线程都执行结束,然后调用getResult()方法来最终显示每个函数的返回值。
因为这些函数执行起来都非常快(斐波那契除外),所以你看到每个函数中都加入了sleep()用于减慢执行速度,以便让我们看到多线程是如何改善性能的。

待续中。。。。。。