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

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

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. dede首页调用文章标题|概述|所在栏目
  2. crt脚本怎么添加等待时间_抖音文案怎么写吸引人?130个抖音文案素材、案例分享!...
  3. wxWidgets:你好世界示例
  4. 增强 wp_list_authors 显示文章最多的作者
  5. 从ipa文件中导出图片
  6. html网页的结构框架代码
  7. DEA使用git提交代码时,点了commit之后卡死在performing code analysis部分,或者performing code analysis结束后没有进入下一步操作。...
  8. 学习Python的利器:内置函数dir()和help()
  9. 查询sql执行计划_使用SQL执行计划进行查询性能调整
  10. jsoup爬虫工具超简单使用(记录)
  11. 统计学习(三):假设检验与 p-values
  12. 永洪BI在 Linux/Unix 下 jdk 环境如何配置?
  13. cropper.js 裁剪图片并上传(文档翻译+demo)
  14. [Arch]常用软件安装使用
  15. c语言课程总结3000字,单片机课程设计心得体会范文3000字
  16. linux 在固定网址yum,linux yum介绍
  17. 田忌赛马c语言程序设计,关于c语言的田忌赛马问题。
  18. 计算机专业与等差数列的联系,数列期末复习
  19. 大一计算机课程学什么,大一新生应该如何学习 主要学什么课程
  20. snownlp对天猫商品评论数据进行情感分析(附源码)

热门文章

  1. “undefined reference to“ 问题解决方法
  2. 用WPS图片编辑出透明
  3. 找工作之计算机网络复习
  4. 产品设计体会(0011)我想做产品经理,如何入行
  5. python lcut精确分词_jieba分词-Python中文分词领域的佼佼者
  6. Java编程思想读书笔记——第九章:接口
  7. 零基础学习Python:基础阶段
  8. 英语语法快速入门2--并列句(附思维导图)
  9. ssm+jsp计算机毕业设计渔具店管理系统5mf28(程序+lw+源码+远程部署)
  10. TDengine 在酷哞哞的应用