1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 多线程编程 - 单线程和多线程执行对比

多线程编程 - 单线程和多线程执行对比

时间:2018-11-15 00:07:59

相关推荐

多线程编程 - 单线程和多线程执行对比

多线程编程 - 单线程和多线程执行对比

递归求斐波那契、阶乘与累加函数的执行。该脚本按照单线程的方式运行这三个函数,之后使用多线程的方式执行同样的任务,用来说明多线程环境的优点。

myThread.py

#!/usr/bin/env python3import threadingfrom time import time, ctimeclass MyThread(threading.Thread):def __init__(self, func, args, name='', verb=False):threading.Thread.__init__(self)self.name = nameself.func = funcself.args = argsself.verb = verbdef getResult(self):return self.resdef run(self):if self.verb:print('starting', self.name, 'at:', ctime())self.res = self.func(*self.args)if self.verb:print(self.name, 'finished at:', ctime())

sample.py

#!/usr/bin/env python3from myThread import MyThreadfrom time import ctime, sleepdef fib(x):sleep(0.005)if x < 2: return 1return (fib(x - 2) + fib(x - 1))def fac(x):sleep(0.1)if x < 2: return 1return (x * fac(x - 1))def sum(x):sleep(0.1)if x < 2: return 1return (x + sum(x - 1))funcs = (fib, fac, sum)n = 12def 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__, True)threads.append(t)for i in nfuncs:threads[i].start()print("thread.join()")for i in nfuncs:threads[i].join()print(threads[i].getResult())print('all DONE')if __name__ == '__main__':main()

yongqiang@DESKTOP-6LEDFIJ:~$ lltotal 13drwxr-xr-x 1 yongqiang yongqiang 512 May 12 12:29 ./drwxr-xr-x 1 rootroot 512 Feb 24 17:54 ../-rw------- 1 yongqiang yongqiang 208 May 12 14:21 .bash_history-rw-r--r-- 1 yongqiang yongqiang 220 Feb 24 17:54 .bash_logout-rw-r--r-- 1 yongqiang yongqiang 3771 Feb 24 17:54 .bashrc---------- 1 yongqiang yongqiang 590 May 12 13:50 myThread.py-rw-r--r-- 1 yongqiang yongqiang 655 Feb 24 17:54 .profile-rw------- 1 yongqiang yongqiang 7 May 12 12:28 .python_history---------- 1 yongqiang yongqiang 1044 May 12 14:23 sample.py-rw-r--r-- 1 yongqiang yongqiang 0 May 12 12:29 .sudo_as_admin_successfulyongqiang@DESKTOP-6LEDFIJ:~$yongqiang@DESKTOP-6LEDFIJ:~$ sudo chmod 777 ./myThread.py ./sample.py[sudo] password for yongqiang:yongqiang@DESKTOP-6LEDFIJ:~$yongqiang@DESKTOP-6LEDFIJ:~$ lltotal 13drwxr-xr-x 1 yongqiang yongqiang 512 May 12 12:29 ./drwxr-xr-x 1 rootroot 512 Feb 24 17:54 ../-rw------- 1 yongqiang yongqiang 208 May 12 14:21 .bash_history-rw-r--r-- 1 yongqiang yongqiang 220 Feb 24 17:54 .bash_logout-rw-r--r-- 1 yongqiang yongqiang 3771 Feb 24 17:54 .bashrc-rwxrwxrwx 1 yongqiang yongqiang 590 May 12 13:50 myThread.py*-rw-r--r-- 1 yongqiang yongqiang 655 Feb 24 17:54 .profile-rw------- 1 yongqiang yongqiang 7 May 12 12:28 .python_history-rwxrwxrwx 1 yongqiang yongqiang 1044 May 12 14:23 sample.py*-rw-r--r-- 1 yongqiang yongqiang 0 May 12 12:29 .sudo_as_admin_successfulyongqiang@DESKTOP-6LEDFIJ:~$yongqiang@DESKTOP-6LEDFIJ:~$ python3 ./sample.py*** SINGLE THREADstarting fib at: Sun May 12 14:25:28 233fib finished at: Sun May 12 14:25:31 starting fac at: Sun May 12 14:25:31 479001600fac finished at: Sun May 12 14:25:32 starting sum at: Sun May 12 14:25:32 78sum finished at: Sun May 12 14:25:33 *** MULTIPLE THREADSstarting fib at: Sun May 12 14:25:33 starting fac at: Sun May 12 14:25:33 starting sum at: Sun May 12 14:25:33 thread.join()sum finished at: Sun May 12 14:25:35 fac finished at: Sun May 12 14:25:35 fib finished at: Sun May 12 14:25:36 23347900160078all DONEyongqiang@DESKTOP-6LEDFIJ:~$

/usr/bin/python3.5 /home/strong/workspace/sample.py*** SINGLE THREADstarting fib at: Sun May 12 17:10:27 233fib finished at: Sun May 12 17:10:29 starting fac at: Sun May 12 17:10:29 479001600fac finished at: Sun May 12 17:10:30 starting sum at: Sun May 12 17:10:30 78sum finished at: Sun May 12 17:10:32 *** MULTIPLE THREADSstarting fib at: Sun May 12 17:10:32 starting fac at: Sun May 12 17:10:32 starting sum at: Sun May 12 17:10:32 thread.join()sum finished at: Sun May 12 17:10:33 fac finished at: Sun May 12 17:10:33 fib finished at: Sun May 12 17:10:34 23347900160078all DONEProcess finished with exit code 0

以单线程模式运行时,只是简单地依次调用每个函数,并在函数执行结束后立即显示相应的结果。

而以多线程模式运行时,并不会立即显示结果。因为我们希望让 MyThread 类越通用越好 (有输出和没有输出的调用都能够执行),我们要一直等到所有线程都执行结束,然后调用 getResult() 方法来最终显示每个函数的返回值。

你会发现在每个函数中都加入了 sleep() 调用,用于减慢执行速度,以便让我们看到多线程是如何改善性能的。在实际工作中,如果确实有不同的执行时间,你肯定不会在其中调用 sleep() 函数。

References

Python 核心编程 (第 3 版)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。