python3.x pool.map方法的实质
我使用多进程的一般方式,都是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方法中,可迭代对象传入函数是从前到后逐个提取元素。
python3.x pool.map方法的实质的更多相关文章
- python3中的map对象返回的是迭代器,该迭代器用list()转列表之后,再次用list()转化时会返回空
练习代码的时候,发现python3中的map()函数返回的可迭代对象,在用list()转成列表之后,再次用list()转列表的时候,获取的是空值(如下所示),所以查了一下python3的map()对象 ...
- python 协程池和pool.map用法
一.问题描述 现在有一段代码,需要扫描一个网段内的ip地址,是否可以ping通. 执行起来效率太慢,需要使用协程. #!/usr/bin/env python # -*- coding: utf-8 ...
- pool.map的第二个参数想传入多个咋整?
from functools import partial from multiprocessing import Pool as ThreadPool pageurls=[] if maxpage: ...
- JavaScript Array map() 方法
语法: array.map(function(currentValue,index,arr), thisValue) currentValue:必须.当前元素的值index:可选.当期元素的索引值ar ...
- js 自带的 map() 方法
1. 方法概述 map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组. 2. 例子 2.1 在字符串中使用map 在一个 String 上使用 map 方法获取字符串中 ...
- jQuery中的map()方法
jQuery中map()方法的使用格式为:$(selector).map(callback(index,domElement)). 将在每一个被选元素上执行map()方法中设置的回调函数,在回调函数中 ...
- 模拟jquery实现each方法和map方法
********************each方法********************** function each( obj, cbk ) { /* * 实现思路: * 1.首先却分传入进来 ...
- javascript中数组的map方法
map方法原型:array1.map(callbackfn[, thisArg]) 参数: array1,必选. 一个数组对象.该函数一般用于数组对象 callbackfn,必选. 最多可以接受三个参 ...
- jQuery 遍历 - map() 方法
定义和用法 map() 把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的 jQuery 对象. 例子1: 构建表单中所有值的列表: <p><b>value为: &l ...
随机推荐
- 雷达无线电系列(一)几种常见的幅度分布函数(matlab)
文件下载地址: https://github.com/mufasa007/myblog/tree/master/%E9%9B%B7%E8%BE%BE%E6%97%A0%E7%BA%BF%E7%94%B ...
- Java并发编程-volatile可见性的介绍
要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么用? ...
- 快速搭建WebAPI(Odata+Code-First)附Odata条件查询表~
Odata是什么? 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准.该标准由微软发起,前三个版本1.0.2.0.3.0都 ...
- java基础(十四)-----详解匿名内部类——Java高级开发必须懂的
在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.匿名内部类使用的形参为何要为final. 使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: n ...
- RS232串口的Windows编程纪要
再次是一篇入门文,各路神仙退散. 直接进入主题,又不是历史课,关于RS232那些前世今生的故事就不摆了. 硬件链接 首先以9针小口为例(大口应当只能去博物馆看了吧)看一下管脚排布,其实RS232本身没 ...
- 知其所以然~分布式事务cap
背景 一致性是一个抽象的.具有多重含义的计算机术语,在不同应用场景下,有不同的定义和含义.在传统的IT时代,一致性通常指强一致性,强一致性通常体现在你中有我.我中有你.浑然一体:而在互联网时代,一致性 ...
- 解决Springboot 的ajax跨域问题-动静分离
@SpringBootApplication public class FsSysApiApp { public static void main(String[] args) { SpringApp ...
- 使用Flume消费Kafka数据到HDFS
1.概述 对于数据的转发,Kafka是一个不错的选择.Kafka能够装载数据到消息队列,然后等待其他业务场景去消费这些数据,Kafka的应用接口API非常的丰富,支持各种存储介质,例如HDFS.HBa ...
- .NET快速信息化系统开发框架 V3.2 -> WinForm“组织机构管理”界面组织机构权限管理采用新的界面,操作权限按模块进行展示
对于某些大型的企业.信息系统,涉及的组织机构较多,模块多.操作权限也多,对用户或角色一一设置模块.操作权限等比较繁琐.我们可以直接对某一组织机构进行权限的设置,这样设置后,同一组织机构的用户就可以拥有 ...
- springboot情操陶冶-初识springboot
前言:springboot由于其轻便和去配置化等的特性已经被广泛应用,基于时代潮流以及不被鄙视,笔者于是开辟此篇开始认识springboot 前话 springboot是基于spring而开发的轻量级 ...