浅谈python3.x pool.map()方法的实质


Posted in Python onJanuary 16, 2019

我使用多进程的一般方式,都是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方法中,可迭代对象传入函数是从前到后逐个提取元素。

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

Python 相关文章推荐
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
python安装Scrapy图文教程
Aug 14 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python如何读写二进制数组数据
Aug 01 Python
Python趣味入门教程之循环语句while
Aug 26 Python
Python selenium模拟网页点击爬虫交管12123违章数据
May 26 Python
python中的random模块和相关函数详解
Apr 22 Python
在Pycharm terminal中字体大小设置的方法
Jan 16 #Python
在pycharm中使用git版本管理以及同步github的方法
Jan 16 #Python
在pycharm中设置显示行数的方法
Jan 16 #Python
PyCharm设置每行最大长度限制的方法
Jan 16 #Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 #Python
在Pycharm中设置默认自动换行的方法
Jan 16 #Python
pycharm的console输入实现换行的方法
Jan 16 #Python
You might like
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP 根据IP地址控制访问的代码
2010/04/22 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Three.js基础学习教程
2017/11/16 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
python实现俄罗斯方块
2018/06/26 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
最新计算机专业自荐信
2013/10/16 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
颐和园导游词
2015/01/30 职场文书
员工考勤管理制度
2015/08/06 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL