多线程编程 - 单线程和多线程执行对比
多线程编程 - 单线程和多线程执行对比
递归求斐波那契、阶乘与累加函数的执行。该脚本按照单线程的方式运行这三个函数,之后使用多线程的方式执行同样的任务,用来说明多线程环境的优点。
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 版)
多线程编程 - 单线程和多线程执行对比相关推荐
- python3多线程编程_Python 3多线程编程学习笔记-基础篇
本文是学习<Python核心编程>的学习笔记,介绍了Python中的全局解释器锁和常用的两个线程模块:thread, threading,并对比他们的优缺点和给出简单的列子. 全局解释器锁 ...
- python多线程编程_python之多线程编程
python 之多线程编程 我们知道 python 中程序一般是从上往下依次执行的,那么即使没有什么联系的两件事也只 能是等一个执行完后再去执行另一个, 这样的就会很浪费时间, 那么有没有办法让两件事 ...
- 什么是单线程和多线程,单线程与多线程的区别
什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的 ...
- wince支持多线程编程吗_WinCE 多线程下绣花机运动控制的实现
绣花机在缝制设备行业中占有极其重要的位置,在国内外都有广阔的市场.国产绣花机在速度.噪声.品质和功能等方面与国外高档机相比,存在着较大的差距,竞争优势较小,因此,加强绣花机的开发不仅是市场需求,更有助 ...
- Java多线程编程递增_java多线程编程之简介
编写正确的程序很难,编写正确的多线程程序更难.如果对多线程理解的不够深入,编写出来的程序往往跟自己的预期不一样,甚至不知道问题出现在哪里.因此,如果想成为一个好的程序员,掌握多线程是必修的一门功课. ...
- mfc多线程编程实例_多线程技术的PLC与PC的通讯方式
点击箭头处"工业之家",选择"关注公众号"! 基于多线程技术的PLC与PC的通讯方式 1.系统构成 推进系统中,PC机选用工控计算机.它是整个控制系统的核心, ...
- 6-4 多线程编程:使用多线程同步与通信,模拟实现售票系统的售票和退票过程。 (20 分)
使用synchronized实现同步控制,并使用wait()和notify()实现线程之间的通信. 编程要求如下: 可售出票的数量为一个固定值(total),从键盘读入.当余票的数量足够出售时(余票数 ...
- java多线程编程核心技术 pdf_Java多线程编程核心技术之volatile关键字
私信我或关注公众号猿来如此呀,回复:学习,获取免费学习资源包 volatile关键字 关键字volatile的主要作用是使变量在多个线程间可见. 1 关键字volatile与死循环 如果不是在多继承的 ...
- python多核多线程编程实例_Python多线程
多线程基础概念 并行与并发并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允许程 ...
最新文章
- python使用matplotlib可视化subplots绘制子图、自定义几行几列子图,如果M行N列,那么最终包含M*N个子图、在指定的子图中添加可视化结果
- 成功解决If your current network has https://www.anaconda.com blocked, please filea support request with
- 如何读论文?-如何写好科技论文之我见(八)
- mysql 学习笔记04 insert与update语句
- 程序员加班一般是有原因的,但是有些程序员却表示:我是自愿的!
- 20200721:每日一题之不同的二叉搜索树 II(leetcode95)
- 实测解决:SpringBoot 中 Invalid character found in the request target 异常
- 使用Eclipse开发基于SSH三大框架的Web项目带图详解
- js截取url所带参数方法与url截取字段中包含中文会乱码的解决方案
- docker - bridge 网桥
- delphi 多线程3
- SpringBoot性能优化方案
- 根节点,子节点,叶节点
- 基于python的国内外研究现状怎么写_如何写国内外研究现状
- Cesium:入门教程(三)之视窗配置
- mysql设置定时备份
- 计算机毕业设计Java小型企业员工工资管理系统(源码+系统+mysql数据库+Lw文档)
- 网络摄像头RTSP视频流WEB端实时播放实现方案
- 捍宇医疗通过聆讯:未实现管线产品商业化,核心产品专利系购买
- Python+OpenCV4虹膜识别
热门文章
- CSS设置背景图片撑满屏幕
- 计算机考在职研究生难不难,软件工程在职研究生很难考吗?都考什么科目?
- 绝不破例!苹果发出最强硬威胁:要全面封杀 Epic Games
- Unity 通过Mesh网格渲染绘制图形与字体
- ABS树脂类最新发表的论文有哪些?
- 办公必备!20个Word文字处理技巧
- android hashmap 写入文件,android – ACRA 4.9.0:如何将ACRA报告写入文件(在应用程序数据文件夹中)...
- 如何在BW中做账龄的动态显示
- 博客创新,如何启发你的创作灵感?
- Django数据库基本配置