Python多线程多进程实例对比解析


Posted in Python onMarch 12, 2020

多线程适合于多io操作

多进程适合于耗cpu(计算)的操作

# 多进程编程
# 耗cpu的操作,用多进程编程, 对于io操作来说,使用多线程编程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from concurrent.futures import ProcessPoolExecutor


def fib(n):
  if n <= 2:
    return 1
  return fib(n - 2) + fib(n - 1)

if __name__ == '__main__':

  # 1. 对于耗cpu操作,多进程优于多线程

  # with ThreadPoolExecutor(3) as executor:
  #   all_task = [executor.submit(fib, num) for num in range(25, 35)]
  #   start_time = time.time()
  #   for future in as_completed(all_task):
  #     data = future.result()
  #     print(data)
  #   print("last time :{}".format(time.time() - start_time)) # 3.905290126800537

  # 多进程 ,在window环境 下必须放在main方法中执行,否则抛异常
  with ProcessPoolExecutor(3) as executor:
    all_task = [executor.submit(fib, num) for num in range(25, 35)]
    start_time = time.time()
    for future in as_completed(all_task):
      data = future.result()
      print(data)
    print("last time :{}".format(time.time() - start_time)) # 2.6130592823028564

可以看到在耗cpu的应用中,多进程明显优于多线程 2.6130592823028564 < 3.905290126800537

下面模拟一个io操作

# 多进程编程
# 耗cpu的操作,用多进程编程, 对于io操作来说,使用多线程编程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from concurrent.futures import ProcessPoolExecutor

def io_operation(n):
  time.sleep(2)
  return n


if __name__ == '__main__':

  # 1. 对于耗cpu操作,多进程优于多线程

  # with ThreadPoolExecutor(3) as executor:
  #   all_task = [executor.submit(io_operation, num) for num in range(25, 35)]
  #   start_time = time.time()
  #   for future in as_completed(all_task):
  #     data = future.result()
  #     print(data)
  #   print("last time :{}".format(time.time() - start_time)) # 8.00358772277832



  # 多进程 ,在window环境 下必须放在main方法中执行,否则抛异常
  with ProcessPoolExecutor(3) as executor:
    all_task = [executor.submit(io_operation, num) for num in range(25, 35)]
    start_time = time.time()
    for future in as_completed(all_task):
      data = future.result()
      print(data)
    print("last time :{}".format(time.time() - start_time)) # 8.12435245513916

可以看到 8.00358772277832 < 8.12435245513916, 即是多线程比多进程更牛逼!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
简介Django框架中可使用的各类缓存
Jul 23 Python
Django卸载之后重新安装的方法
Mar 15 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
PyQt5每天必学之事件与信号
Apr 20 Python
详解Python3的TFTP文件传输
Jun 26 Python
Python3爬虫中Selenium的用法详解
Jul 10 Python
深入了解Python enumerate和zip
Jul 16 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
一篇文章弄懂Python中的内建函数
Aug 07 Python
Python线程协作threading.Condition实现过程解析
Mar 12 #Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 #Python
Python基于read(size)方法读取超大文件
Mar 12 #Python
Python函数生成器原理及使用详解
Mar 12 #Python
python deque模块简单使用代码实例
Mar 12 #Python
python中安装django模块的方法
Mar 12 #Python
python3 sorted 如何实现自定义排序标准
Mar 12 #Python
You might like
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
PHP设置进度条的方法
2015/07/08 PHP
PHP对象实例化单例方法
2017/01/19 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
js实现按一下删除键删除整个单词附demo
2014/09/05 Javascript
清除输入框内的空格
2016/12/21 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
Python中处理时间的几种方法小结
2015/04/09 Python
python写日志封装类实例
2015/06/28 Python
Python字符串切片操作知识详解
2016/03/28 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
2020/01/21 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
Django 实现图片上传和下载功能
2020/12/31 Python
精选奢华:THE LIST
2019/09/05 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
EJB实例的生命周期
2016/10/28 面试题
工程管理英文求职信
2014/03/18 职场文书
绿色环保标语
2014/06/12 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
生日答谢词
2015/01/05 职场文书
防汛通知
2015/04/25 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL