单线程与多线程
分别使用单线程和多线程调用斐波那契额数列,阶乘和累加和三个函数:
from time import ctime,sleep
import threading
class myThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name
def getResult(self):
return self.res
def run(self):
print(self.name, '开始于', ctime())
self.res = self.func(*self.args)
print(self.name,'结束于', ctime())
def fib(n):
sleep(0.005)
if n < 2:
return 1
return fib(n-1) + fib(n-2)
def fac(n):
sleep(0.1)
if n<2:
return 1
return (n * fac(n-1))
def sum(n):
sleep(0.1)
if n < 2:
return 1
return n + sum(n-1)
funs = [fib, fac, sum]
n = 12
def main():
nfuns = len(funs)
print('**** 单线程 ****')
for i in range(nfuns):
print(funs[i].__name__, '开始于', ctime())
print(funs[i](n))
print(funs[i].__name__, '结束于', ctime())
print('**** 多线程 ****')
threads = []
for i in range(nfuns):
t = myThread(funs[i],(n,),funs[i].__name__)
threads.append(t)
for i in range(nfuns):
threads[i].start()
for i in range(nfuns):
threads[i].join()
print(threads[i].getResult())
print('ALL DONE')
if __name__ == '__main__':
main()
############运行结果##################
**** 单线程 ****
fib 开始于 Sun Sep 29 20:14:16 2019
233
fib 结束于 Sun Sep 29 20:14:19 2019
fac 开始于 Sun Sep 29 20:14:19 2019
479001600
fac 结束于 Sun Sep 29 20:14:20 2019
sum 开始于 Sun Sep 29 20:14:20 2019
78
sum 结束于 Sun Sep 29 20:14:21 2019
**** 多线程 ****
fib 开始于 Sun Sep 29 20:14:21 2019
fac 开始于 Sun Sep 29 20:14:21 2019
sum 开始于 Sun Sep 29 20:14:21 2019
fac 结束于 Sun Sep 29 20:14:23 2019
sum 结束于 Sun Sep 29 20:14:23 2019
fib 结束于 Sun Sep 29 20:14:24 2019
233
479001600
78
ALL DONE
可以看到,使用单线程时,只有当上一个函数运行完之后才会执行下一个函数,而多线程中三个函数在同一时刻开始,执行结束的时间远远小于单线程。
join()阻塞主线程,允许主线程等待线程的结束。