第六十节 多进程Multiprocessing

  • 前言
  • 实践

前言

多进程能够在不同的CPU核心上并行运行任务,可以绕过用于线程的GIL。
多进程:更适合密集计算相关任务(cpu使用率高)。
多线程:更好地处理与IO相关的任务。

实践

我们来实现一个数据求和的功能,例如从0加到100000000。首先我们使用单个进程进行计算:

from multiprocessing import Process, cpu_count
import time
result = {}
def counter(num_1, num_2, name):count = 0for i in range(num_1, num_2):count += iresult[name] = countprint(result)def main():a = Process(target=counter, args=(0, 100000000, '进程1'))a.start()a.join()print('运行耗时: {} 秒'.format(time.perf_counter()))if __name__ == '__main__':main()
>>> {'进程1': 4999999950000000}
>>> 运行耗时: 13.5747503 秒

接下来我们使用两个进程进行计算:

from multiprocessing import Process, cpu_count
import time
result = {}
def counter(num_1, num_2, name):count = 0for i in range(num_1, num_2):count += iresult[name] = countprint(result)def main():a = Process(target=counter, args=(0, 50000000, '进程1'))a.start()b = Process(target=counter, args=(50000000, 100000000, '进程2'))b.start()a.join()b.join()print('运行耗时: {} 秒'.format(time.perf_counter()))if __name__ == '__main__':main()
>>> {'进程1': 1249999975000000}
>>> {'进程2': 3749999975000000}
>>> 运行耗时: 9.9812741 秒

接下来我们尝试跑满所有的CPU核心:

from multiprocessing import Process, cpu_count
import time
result = {}
def counter(num_1, num_2, name):count = 0for i in range(num_1, num_2):count += iresult[name] = countprint(result)def main():print(cpu_count())  # 计算本机的CPU核心数目a = Process(target=counter, args=(0, 25000000, '进程1'))a.start()b = Process(target=counter, args=(25000000, 50000000, '进程2'))b.start()c = Process(target=counter, args=(50000000, 75000000, '进程3'))c.start()d = Process(target=counter, args=(75000000, 100000000, '进程4'))d.start()a.join()b.join()c.join()d.join()print('运行耗时: {} 秒'.format(time.perf_counter()))if __name__ == '__main__':main()
>>> 4
>>> {'进程3': 1562499987500000}
>>> {'进程1': 312499987500000}
>>> {'进程2': 937499987500000}
>>> {'进程4': 2187499987500000}
>>> 运行耗时: 5.9548173 秒

发现当跑满所有的CPU核心时速度是最快的(并不是越多越好哦,再多的话速度反而慢了),所以我们一般设定多进程的进程数目为CPU的核心数目

Python编程基础:第六十节 多进程Multiprocessing相关推荐

  1. Python编程基础:第二十节 函数Function

    第二十节 函数Function 前言 实践 前言 目前为止,我们已经学习了常见的数据类型以及逻辑结构.但是代码都只能运行一次,如果想多次运行该段代码就得重复写多次.为了避免书写冗余的代码,我们需要引入 ...

  2. Python编程基础:第十节 while循环While Loops

    第十节 while循环While Loops 前言 实践 前言 如果你需要计算机反复执行某个代码段,你就需要用到while循环,while循环的结构如下: while 判断1:代码段1 当判断1为Tr ...

  3. Python编程基础:第十六节 元组Tuple

    第十六节 元组Tuple 前言 实践 前言 我们这一节来学习一个与列表非常相似的数据结构--元组.需要注意的是元组定义好以后,其中的元素是不能改变的,并且所有元素是有序排列的, 实践 我们先来创建一个 ...

  4. Python编程基础:第二十六节 kwargs参数**kwargs

    第二十六节 kwargs参数**kwargs 前言 实践 前言 上一节我们尝试传入任意多的参数,我们这一节来学习传入任意多具有参数名称的参数.kwargs参数将用户传入的参数打包为字典传入函数中用于进 ...

  5. Python编程基础:第二十九节 异常Exception

    第二十九节 异常Exception 前言 实践 前言 我们在写代码时不可避免地会出错,这时候编译器便会抛出异常并中断程序的执行.针对这种情况,我们可以采用异常处理的方式捕捉程序中的异常信息,并将异常信 ...

  6. Python编程基础:第二十五节 args参数*args

    第二十五节 args参数*args 前言 实践 前言 我们目前学习到的函数的参数个数都是固定的,那么我们是否可以指定任意多个参数呢?其实是可以的,这里就用到了args参数,它可以将用户指定的任意多个参 ...

  7. Python编程基础:第二十四节 作用域Scope

    第二十四节 作用域Scope 前言 实践 前言 在Python中每一个变量都有其自己的生命周期,我们一般将变量分为全局变量与局部变量,全局变量是指在整个代码内部都可以访问到的变量,局部变量是指只有在函 ...

  8. Python编程基础:第十九节 索引Index Operator

    第十九节 索引Index Operator 前言 实践 前言 我们在字符串学习过程中已经接触过索引的相关内容,我们在这里做一个小结,Python中的索引分为两部分,一种是从左向右,从0开始依次递增,例 ...

  9. Python编程基础:第十五节 二维列表2D Lists

    第十五节 二维列表2D Lists 前言 实践 前言 列表中的元素可以是任何形式,整型.浮点型.字符串型,甚至是一个列表.当列表的元素也是列表时,我们将其称为二维列表. 实践 我们先来创建多个一维列表 ...

最新文章

  1. PTA团体程序设计天梯赛-L2-013 红色警报
  2. session与cookie的简单使用
  3. ext js ajax表单校验,Extjs之grid单元格编辑校验(示例代码)
  4. Spark之Spark概述
  5. C#自定义控件,在项目工具箱中加入自定义控件,调用自定义控件
  6. 针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom
  7. 8s nfs 挂载文件_Kubernetes集群使用网络存储NFS
  8. 米斯特白帽培训讲义 实战篇 WordPress
  9. 右键菜单_右键菜单太长会导致电脑卡顿?轻松删除右键菜单无用项
  10. 双显示器 启动黑屏 黑苹果_教你注入EDID 解决黑苹果显示器显示问题
  11. 视频截图 使用ffmpeg_mencoder
  12. 差分进化算法用c语言实现,python 实现差分进化算法
  13. c语言编写算术编码,编程实现算术编码算法.doc
  14. 认识CPU的工作原理
  15. 计算机硬盘分区显示不全,windows7系统磁盘分区图标显示不正常的两种解决方法【图】...
  16. spring boot的 banner
  17. 一、计算机核心组成及CPU核心组成
  18. 2023轻薄投影仪选哪款?极米Z6X Pro成年轻人租房首选投影
  19. 网格建模资源管理(第一次翻译老外的东西,嘿嘿!)
  20. Graphite的安装与部署

热门文章

  1. SpringBoot报错Unsatisfied dependency expressed through field userMapper和Whitelabel Error Page解决方案
  2. 安卓makefile与linux,分析linux make命令与Makefile的区别
  3. android+命令行编译,打包生成apk文件,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包...
  4. oracle怎么查询成绩学号,oracle学习(简单查询)
  5. 宝塔面板部署nuxt_MacOS下创建及部署vue.js项目(及Nuxt.js、PM2等相关流程)
  6. 系统运维手册_如何摆脱“背锅侠”,做一个合格的IT运维人员
  7. 全国计算机等级考试培训方案,第23次全国计算机等级考试培训安排.doc
  8. centos修改磁盘uuid_CentOS 6如何修改磁盘配额限制
  9. 计算机系统加固方法有哪些,计算机系统的加固 .doc
  10. ubuntu 环境下调试mysql源码_Linux中eclipse调试mysql源代码