多线程编程 - 单线程和多线程执行对比
多线程编程 - 单线程和多线程执行对比
递归求斐波那契、阶乘与累加函数的执行。该脚本按照单线程的方式运行这三个函数,之后使用多线程的方式执行同样的任务,用来说明多线程环境的优点。
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多线程
多线程基础概念 并行与并发并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允许程 ...
最新文章
- dede首页调用文章标题|概述|所在栏目
- crt脚本怎么添加等待时间_抖音文案怎么写吸引人?130个抖音文案素材、案例分享!...
- wxWidgets:你好世界示例
- 增强 wp_list_authors 显示文章最多的作者
- 从ipa文件中导出图片
- html网页的结构框架代码
- DEA使用git提交代码时,点了commit之后卡死在performing code analysis部分,或者performing code analysis结束后没有进入下一步操作。...
- 学习Python的利器:内置函数dir()和help()
- 查询sql执行计划_使用SQL执行计划进行查询性能调整
- jsoup爬虫工具超简单使用(记录)
- 统计学习(三):假设检验与 p-values
- 永洪BI在 Linux/Unix 下 jdk 环境如何配置?
- cropper.js 裁剪图片并上传(文档翻译+demo)
- [Arch]常用软件安装使用
- c语言课程总结3000字,单片机课程设计心得体会范文3000字
- linux 在固定网址yum,linux yum介绍
- 田忌赛马c语言程序设计,关于c语言的田忌赛马问题。
- 计算机专业与等差数列的联系,数列期末复习
- 大一计算机课程学什么,大一新生应该如何学习 主要学什么课程
- snownlp对天猫商品评论数据进行情感分析(附源码)
热门文章
- “undefined reference to“ 问题解决方法
- 用WPS图片编辑出透明
- 找工作之计算机网络复习
- 产品设计体会(0011)我想做产品经理,如何入行
- python lcut精确分词_jieba分词-Python中文分词领域的佼佼者
- Java编程思想读书笔记——第九章:接口
- 零基础学习Python:基础阶段
- 英语语法快速入门2--并列句(附思维导图)
- ssm+jsp计算机毕业设计渔具店管理系统5mf28(程序+lw+源码+远程部署)
- TDengine 在酷哞哞的应用