我使用多进程的一般方式,都是multiprocessing模块中的Pool.map()方法。下面写一个简单的示例和解析。至于此种方法使用多进程的效率问题,还希望大佬予以指正。

示例:

"""
探索pool.map多进程执行方式的实质
""" from multiprocessing import Pool
from time import sleep
from datetime import datetime class forMap:
def __init__(self):
self.name = '没啥用的初始化' def forPrinit(self, i):
sleep(i)
print(i)
return i ** 2

基本的代码已经写好,下面看看怎么使用多进程去执行。

  • 执行示例1:
if __name__ == '__main__':
s = datetime.now()
tt = forMap()
# 进程池中创建两个进程,调用计算机的两个内核去帮我做事。
p = Pool(2) l = [2, 4, 6]
rList = p.map(tt.forTest, l)
print(rList) p.close()
p.join() e = datetime.now()
print('多进程执行时间:', e - s)

运行结果:

2
4
6
[4, 16, 36]
多进程执行时间: 0:00:08.191251

由于在进程池中创建了两个进程,所以代码会调用计算机的两个内核。而列表l中的三个元素中的前两个(“2”和“4”),会依次传入函数中,由计算机内核A和B去执行。当某一个内核执行完,会继续接收下一个传入参数“6”函数。而且内核A执行的函数,只会sleep两秒,所以,传入参数“6”的函数会由内核A去执行。所以A一共执行了2 + 6 为8秒,又由于是并行,所以总的执行时间是8秒(多的那零点几是初始化、赋值、打印等操作)。

  • 执行示例2:
if __name__ == '__main__':
s = datetime.now()
tt = forMap()
# 进程池中创建三个进程
p = Pool(3) l = [2, 4, 6]
rList = p.map(tt.forTest, l)
print(rList) p.close()
p.join() e = datetime.now()
print('多进程执行时间:', e - s)

执行结果:

2
4
6
[4, 16, 36]
多进程执行时间: 0:00:06.273263

创建了三个进程 ,并行执行,所以执行时间是6秒

  • 执行示例3:
if __name__ == '__main__':
s = datetime.now()
tt = forMap()
# 进程池中创建三个进程
p = Pool(3) l = [2, 4, 6, 8]
rList = p.map(tt.forTest, l)
print(rList) p.close()
p.join() e = datetime.now()
print('多进程执行时间:', e - s)

执行结果:

2
4
6
8
[4, 16, 36, 64]
多进程执行时间: 0:00:10.211451

在列表中添加一个元素,首先内核A、B、C分别执行2, 4, 6。A先结束,所以8也会由A来执行。

  • 执行示例4:
if __name__ == '__main__':
s = datetime.now()
tt = forMap()
# 进程池中创建三个进程
p = Pool(2) l = [2, 4, 8, 6]
rList = p.map(tt.forTest, l)
print(rList) p.close()
p.join() e = datetime.now()
print('多进程执行时间:', e - s)

执行结果:

2
4
8
6
[4, 16, 64, 36]
多进程执行时间: 0:00:10.200389

还是创建两个进程,将列表中第3和第4个元素交换位置,执行结果为10秒多,而且返回值也是交换过位置之后的,说明map方法中,可迭代对象传入函数是从前到后逐个提取元素。

最新文章

  1. HTML 样式表
  2. HazelCast 的内存管理原理
  3. cordova插件iOS平台实战开发注意点
  4. 7. 泛化(Generalization)
  5. Java作业
  6. MIT算法导论——第四讲.Quicksort
  7. 基于redis实现的分布式锁
  8. iOS中navigationItem的titleView如何居中
  9. bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)
  10. iOS 开发常用设置
  11. USACO Cow Pedigrees 【Dp】
  12. Windows 10 IoT Serials 5 - 如何为树莓派应用程序添加语音识别与交互功能
  13. 复选框选中删除行(DOM练习)
  14. 最新版的Chrome如何设置网页编码
  15. Fetch请求后台的数据
  16. C++学习之 —— 输入输出
  17. git提交待审核代码,报错没有change-id的解决方法
  18. Djnogo Web开发学习笔记(2)
  19. jmap dump文件压缩后失效
  20. 依赖注入(Dependency Injection)

热门文章

  1. JavaScript基础学习-函数及作用域
  2. 帆软报表FineReport中数据连接之Tomcat配置JNDI连接
  3. bzoj4305: 数列的GCD
  4. win7(32/64)+apache2.4+php5.5+mysql5.6 环境搭建配置
  5. :“boost/serialization/string.hpp”: No such file or directory 错误
  6. golang的采集库
  7. struts配置。泪奔...
  8. Read Asia Embedded fell
  9. hadoop2.2编程:从default mapreduce program 来理解mapreduce
  10. RabbitMQ挂掉问题处理
  11. SurfaceView绘图机制
  12. CSS复习第一天(简单规范)
  13. Java Web整合开发(4) -- JSP
  14. ubuntu12.04 desktop默认无ssh支持
  15. 大叔学ML第一:梯度下降
  16. axios请求接口的踩坑之路
  17. 【C语言】 8421BCD码与二进制的转换
  18. “吃神么,买神么”的第一个Sprint计划(结束)
  19. HDU 2544 最短路 最短路问题
  20. 查看linux系统配置(centos/redhat)