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 相关文章推荐
python类的继承实例详解
Mar 30 Python
python实现神经网络感知器算法
Dec 20 Python
将python代码和注释分离的方法
Apr 21 Python
Django安装配置mysql的方法步骤
Oct 15 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
django 简单实现登录验证给你
Nov 06 Python
python文字转语音实现过程解析
Nov 12 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
opencv3/C++图像像素操作详解
Dec 10 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 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中使用Oracle数据库(6)
2006/10/09 PHP
php开发环境配置记录
2011/01/14 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
ThinkPHP使用smarty模板引擎的方法
2014/07/01 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
详解Python发送邮件实例
2016/01/10 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Python单元测试实例详解
2018/05/25 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
python实现局域网内实时通信代码
2019/12/22 Python
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
Linux文件系统类型
2012/02/15 面试题
软件测试工程师面试问题精选
2016/10/28 面试题
爱国演讲稿400字
2014/05/07 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python
Windows Server 2012 修改远程默认端口3389的方法
2022/04/28 Servers