Python编程基础:第六十节 多进程Multiprocessing
第六十节 多进程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相关推荐
- Python编程基础:第二十节 函数Function
第二十节 函数Function 前言 实践 前言 目前为止,我们已经学习了常见的数据类型以及逻辑结构.但是代码都只能运行一次,如果想多次运行该段代码就得重复写多次.为了避免书写冗余的代码,我们需要引入 ...
- Python编程基础:第十节 while循环While Loops
第十节 while循环While Loops 前言 实践 前言 如果你需要计算机反复执行某个代码段,你就需要用到while循环,while循环的结构如下: while 判断1:代码段1 当判断1为Tr ...
- Python编程基础:第十六节 元组Tuple
第十六节 元组Tuple 前言 实践 前言 我们这一节来学习一个与列表非常相似的数据结构--元组.需要注意的是元组定义好以后,其中的元素是不能改变的,并且所有元素是有序排列的, 实践 我们先来创建一个 ...
- Python编程基础:第二十六节 kwargs参数**kwargs
第二十六节 kwargs参数**kwargs 前言 实践 前言 上一节我们尝试传入任意多的参数,我们这一节来学习传入任意多具有参数名称的参数.kwargs参数将用户传入的参数打包为字典传入函数中用于进 ...
- Python编程基础:第二十九节 异常Exception
第二十九节 异常Exception 前言 实践 前言 我们在写代码时不可避免地会出错,这时候编译器便会抛出异常并中断程序的执行.针对这种情况,我们可以采用异常处理的方式捕捉程序中的异常信息,并将异常信 ...
- Python编程基础:第二十五节 args参数*args
第二十五节 args参数*args 前言 实践 前言 我们目前学习到的函数的参数个数都是固定的,那么我们是否可以指定任意多个参数呢?其实是可以的,这里就用到了args参数,它可以将用户指定的任意多个参 ...
- Python编程基础:第二十四节 作用域Scope
第二十四节 作用域Scope 前言 实践 前言 在Python中每一个变量都有其自己的生命周期,我们一般将变量分为全局变量与局部变量,全局变量是指在整个代码内部都可以访问到的变量,局部变量是指只有在函 ...
- Python编程基础:第十九节 索引Index Operator
第十九节 索引Index Operator 前言 实践 前言 我们在字符串学习过程中已经接触过索引的相关内容,我们在这里做一个小结,Python中的索引分为两部分,一种是从左向右,从0开始依次递增,例 ...
- Python编程基础:第十五节 二维列表2D Lists
第十五节 二维列表2D Lists 前言 实践 前言 列表中的元素可以是任何形式,整型.浮点型.字符串型,甚至是一个列表.当列表的元素也是列表时,我们将其称为二维列表. 实践 我们先来创建多个一维列表 ...
最新文章
- PTA团体程序设计天梯赛-L2-013 红色警报
- session与cookie的简单使用
- ext js ajax表单校验,Extjs之grid单元格编辑校验(示例代码)
- Spark之Spark概述
- C#自定义控件,在项目工具箱中加入自定义控件,调用自定义控件
- 针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom
- 8s nfs 挂载文件_Kubernetes集群使用网络存储NFS
- 米斯特白帽培训讲义 实战篇 WordPress
- 右键菜单_右键菜单太长会导致电脑卡顿?轻松删除右键菜单无用项
- 双显示器 启动黑屏 黑苹果_教你注入EDID 解决黑苹果显示器显示问题
- 视频截图 使用ffmpeg_mencoder
- 差分进化算法用c语言实现,python 实现差分进化算法
- c语言编写算术编码,编程实现算术编码算法.doc
- 认识CPU的工作原理
- 计算机硬盘分区显示不全,windows7系统磁盘分区图标显示不正常的两种解决方法【图】...
- spring boot的 banner
- 一、计算机核心组成及CPU核心组成
- 2023轻薄投影仪选哪款?极米Z6X Pro成年轻人租房首选投影
- 网格建模资源管理(第一次翻译老外的东西,嘿嘿!)
- Graphite的安装与部署
热门文章
- SpringBoot报错Unsatisfied dependency expressed through field userMapper和Whitelabel Error Page解决方案
- 安卓makefile与linux,分析linux make命令与Makefile的区别
- android+命令行编译,打包生成apk文件,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包...
- oracle怎么查询成绩学号,oracle学习(简单查询)
- 宝塔面板部署nuxt_MacOS下创建及部署vue.js项目(及Nuxt.js、PM2等相关流程)
- 系统运维手册_如何摆脱“背锅侠”,做一个合格的IT运维人员
- 全国计算机等级考试培训方案,第23次全国计算机等级考试培训安排.doc
- centos修改磁盘uuid_CentOS 6如何修改磁盘配额限制
- 计算机系统加固方法有哪些,计算机系统的加固 .doc
- ubuntu 环境下调试mysql源码_Linux中eclipse调试mysql源代码