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

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

myThread.py

#!/usr/bin/env python3import threading
from 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 MyThread
from 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:~$ ll
total 13
drwxr-xr-x 1 yongqiang yongqiang  512 May 12 12:29 ./
drwxr-xr-x 1 root      root       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_successful
yongqiang@DESKTOP-6LEDFIJ:~$
yongqiang@DESKTOP-6LEDFIJ:~$ sudo chmod 777 ./myThread.py ./sample.py
[sudo] password for yongqiang:
yongqiang@DESKTOP-6LEDFIJ:~$
yongqiang@DESKTOP-6LEDFIJ:~$ ll
total 13
drwxr-xr-x 1 yongqiang yongqiang  512 May 12 12:29 ./
drwxr-xr-x 1 root      root       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_successful
yongqiang@DESKTOP-6LEDFIJ:~$
yongqiang@DESKTOP-6LEDFIJ:~$ python3 ./sample.py
*** SINGLE THREAD
starting fib at: Sun May 12 14:25:28 2019
233
fib finished at: Sun May 12 14:25:31 2019
starting fac at: Sun May 12 14:25:31 2019
479001600
fac finished at: Sun May 12 14:25:32 2019
starting sum at: Sun May 12 14:25:32 2019
78
sum finished at: Sun May 12 14:25:33 2019*** MULTIPLE THREADS
starting fib at: Sun May 12 14:25:33 2019
starting fac at: Sun May 12 14:25:33 2019
starting sum at: Sun May 12 14:25:33 2019
thread.join()
sum finished at: Sun May 12 14:25:35 2019
fac finished at: Sun May 12 14:25:35 2019
fib finished at: Sun May 12 14:25:36 2019
233
479001600
78
all DONE
yongqiang@DESKTOP-6LEDFIJ:~$
/usr/bin/python3.5 /home/strong/workspace/sample.py
*** SINGLE THREAD
starting fib at: Sun May 12 17:10:27 2019
233
fib finished at: Sun May 12 17:10:29 2019
starting fac at: Sun May 12 17:10:29 2019
479001600
fac finished at: Sun May 12 17:10:30 2019
starting sum at: Sun May 12 17:10:30 2019
78
sum finished at: Sun May 12 17:10:32 2019*** MULTIPLE THREADS
starting fib at: Sun May 12 17:10:32 2019
starting fac at: Sun May 12 17:10:32 2019
starting sum at: Sun May 12 17:10:32 2019
thread.join()
sum finished at: Sun May 12 17:10:33 2019
fac finished at: Sun May 12 17:10:33 2019
fib finished at: Sun May 12 17:10:34 2019
233
479001600
78
all DONEProcess finished with exit code 0

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

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

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

References

Python 核心编程 (第 3 版)

多线程编程 - 单线程和多线程执行对比相关推荐

  1. python3多线程编程_Python 3多线程编程学习笔记-基础篇

    本文是学习<Python核心编程>的学习笔记,介绍了Python中的全局解释器锁和常用的两个线程模块:thread, threading,并对比他们的优缺点和给出简单的列子. 全局解释器锁 ...

  2. python多线程编程_python之多线程编程

    python 之多线程编程 我们知道 python 中程序一般是从上往下依次执行的,那么即使没有什么联系的两件事也只 能是等一个执行完后再去执行另一个, 这样的就会很浪费时间, 那么有没有办法让两件事 ...

  3. 什么是单线程和多线程,单线程与多线程的区别

    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的 ...

  4. wince支持多线程编程吗_WinCE 多线程下绣花机运动控制的实现

    绣花机在缝制设备行业中占有极其重要的位置,在国内外都有广阔的市场.国产绣花机在速度.噪声.品质和功能等方面与国外高档机相比,存在着较大的差距,竞争优势较小,因此,加强绣花机的开发不仅是市场需求,更有助 ...

  5. Java多线程编程递增_java多线程编程之简介

    编写正确的程序很难,编写正确的多线程程序更难.如果对多线程理解的不够深入,编写出来的程序往往跟自己的预期不一样,甚至不知道问题出现在哪里.因此,如果想成为一个好的程序员,掌握多线程是必修的一门功课. ...

  6. mfc多线程编程实例_多线程技术的PLC与PC的通讯方式

    点击箭头处"工业之家",选择"关注公众号"! 基于多线程技术的PLC与PC的通讯方式 1.系统构成  推进系统中,PC机选用工控计算机.它是整个控制系统的核心, ...

  7. 6-4 多线程编程:使用多线程同步与通信,模拟实现售票系统的售票和退票过程。 (20 分)

    使用synchronized实现同步控制,并使用wait()和notify()实现线程之间的通信. 编程要求如下: 可售出票的数量为一个固定值(total),从键盘读入.当余票的数量足够出售时(余票数 ...

  8. java多线程编程核心技术 pdf_Java多线程编程核心技术之volatile关键字

    私信我或关注公众号猿来如此呀,回复:学习,获取免费学习资源包 volatile关键字 关键字volatile的主要作用是使变量在多个线程间可见. 1 关键字volatile与死循环 如果不是在多继承的 ...

  9. python多核多线程编程实例_Python多线程

    多线程基础概念 并行与并发并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允许程 ...

最新文章

  1. python使用matplotlib可视化subplots绘制子图、自定义几行几列子图,如果M行N列,那么最终包含M*N个子图、在指定的子图中添加可视化结果
  2. 成功解决If your current network has https://www.anaconda.com blocked, please filea support request with
  3. 如何读论文?-如何写好科技论文之我见(八)
  4. mysql 学习笔记04 insert与update语句
  5. 程序员加班一般是有原因的,但是有些程序员却表示:我是自愿的!
  6. 20200721:每日一题之不同的二叉搜索树 II(leetcode95)
  7. 实测解决:SpringBoot 中 Invalid character found in the request target 异常
  8. 使用Eclipse开发基于SSH三大框架的Web项目带图详解
  9. js截取url所带参数方法与url截取字段中包含中文会乱码的解决方案
  10. docker - bridge 网桥
  11. delphi 多线程3
  12. SpringBoot性能优化方案
  13. 根节点,子节点,叶节点
  14. 基于python的国内外研究现状怎么写_如何写国内外研究现状
  15. Cesium:入门教程(三)之视窗配置
  16. mysql设置定时备份
  17. 计算机毕业设计Java小型企业员工工资管理系统(源码+系统+mysql数据库+Lw文档)
  18. 网络摄像头RTSP视频流WEB端实时播放实现方案
  19. 捍宇医疗通过聆讯:未实现管线产品商业化,核心产品专利系购买
  20. Python+OpenCV4虹膜识别

热门文章

  1. CSS设置背景图片撑满屏幕
  2. 计算机考在职研究生难不难,软件工程在职研究生很难考吗?都考什么科目?
  3. 绝不破例!苹果发出最强硬威胁:要全面封杀 Epic Games
  4. Unity 通过Mesh网格渲染绘制图形与字体
  5. ABS树脂类最新发表的论文有哪些?
  6. 办公必备!20个Word文字处理技巧
  7. android hashmap 写入文件,android – ACRA 4.9.0:如何将ACRA报告写入文件(在应用程序数据文件夹中)...
  8. 如何在BW中做账龄的动态显示
  9. 博客创新,如何启发你的创作灵感?
  10. Django数据库基本配置