【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
1、apply 和 apply_async 一次执行一个任务,但 apply_async 可以异步执行,因而也可以实现并发。
2、map 和 map_async 与 apply 和 apply_async 的区别是可以并发执行任务。
3、starmap 和 starmap_async 与 map 和 map_async 的区别是,starmap 和 starmap_async 可以传入多个参数。
4、imap 和 imap_unordered 与 map_async 同样是异步,区别是:
map_async生成子进程时使用的是list,而imap和 imap_unordered则是Iterable,map_async效率略高,而imap和 imap_unordered内存消耗显著的小。
在处理结果上,imap 和 imap_unordered 可以尽快返回一个Iterable的结果,而map_async则需要等待全部Task执行完毕,返回list。
而imap 和 imap_unordered 的区别是:imap 和 map_async一样,都按顺序等待Task的执行结果,而imap_unordered则不必。 imap_unordered返回的Iterable,会优先迭代到先执行完成的Task。 不理解的看最下面的一组例子。
你可以自己去写一些小demo跑一下,观察一下它们之间运行方式的一些区别。下面是我跑的一些demo:
一、单次执行apply 和 apply_async
1、单次同步执行apply
一个任务执行完再进行下一个任务
import multiprocessing
import timedef func(msg):print("msg:", msg)time.sleep(2)print("end")if __name__ == "__main__":pool = multiprocessing.Pool()for i in range(2):msg = "hello %d" %(i)pool.apply(func, (msg, ))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出:
msg: hello 0
end
msg: hello 1
end
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.
2、单次异步执行apply_async
单次启动一个任务,但是异步执行,启动后不等这个进程结束又开始执行新任务
import multiprocessing
import timedef func(msg):print("msg:", msg)time.sleep(1)print("end")if __name__ == "__main__":pool = multiprocessing.Pool(processes = 2)for i in range(2):msg = "hello %d" %(i)pool.apply_async(func, (msg, )) #维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")# 输出
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
msg: hello 0
msg: hello 1
end
end
Sub-process(es) done.
二、多任务执行map 和 map_async
1、阻塞到任务列表中所有任务完成再往下执行 map
import multiprocessing
import timedef func(msg):print("msg:", msg)time.sleep(2)print("end")if __name__ == "__main__":pool = multiprocessing.Pool(2)pool.map(func, range(2))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出(注意Mark~位置):
msg: 0
msg: 1
end
end
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.
2、异步,任务执行时不阻塞 map_async
import multiprocessing
import timedef func(msg):print("msg:", msg)time.sleep(2)print("end")if __name__ == "__main__":pool = multiprocessing.Pool(2)pool.map_async(func, range(2))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出:
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
msg: 0
msg: 1
end
end
Sub-process(es) done.
三、传入多个参数starmap 和 starmap_async
与二中 map 和 map_async 的区别是,这两个函数可以传入多个参数
1、阻塞starmap
import multiprocessing
import timedef func(msg1, msg2):print("msg1:", msg1, "msg2:", msg2)time.sleep(2)print("end")if __name__ == "__main__":pool = multiprocessing.Pool(2)msgs = [(1,1),(2,2)]pool.starmap(func, msgs)print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出
msg1: 1 msg2: 1
msg1: 2 msg2: 2
end
end
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.
2、异步starmap_async
import multiprocessing
import timedef func(msg1, msg2):print("msg1:", msg1, "msg2:", msg2)time.sleep(2)print("end")if __name__ == "__main__":pool = multiprocessing.Pool(2)msgs = [(1, 1), (2, 2)]pool.starmap_async(func, msgs)print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出:
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
msg1: 1 msg2: 1
msg1: 2 msg2: 2
end
end
Sub-process(es) done.
四、获取进程池中的结果——map_async与imap和imap_unordered的区别
注意:在获取进程池中的结果时,map_async、imap、imap_unordered三个方法都会阻塞。
map_async 与 imap、imap_unordered区别是:map_async需要等待所有Task执行结束后返回list,而imap 和 imap_unordered 可以尽快返回一个Iterable的结果。
imap 和 imap_unordered 的区别是:imap 和 map_async一样,都按顺序等待Task的执行结果,而imap_unordered则不必。 imap_unordered返回的Iterable,会优先迭代到先执行完成的Task。
1、list、有序——map_async
import multiprocessing
import timedef func(msg):print("msg:", msg)time.sleep(4-msg)return msgif __name__ == "__main__":pool = multiprocessing.Pool(3)results = pool.map_async(func, range(3))for res in results.get():print(res)print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出
msg: 0
msg: 1
msg: 2
0
1
2
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.
2、iterate、有序——imap
import multiprocessing
import timedef func(msg):print("msg: ", msg)time.sleep(4-msg)return msgif __name__ == "__main__":pool = multiprocessing.Pool(3)results = pool.imap(func, range(3))for res in results:print("res: ",res)print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出
msg: 0
msg: 1
msg: 2
res: 0
res: 1
res: 2
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.
3、iterate、无序——imap_unordered
import multiprocessing
import timedef func(msg):print("msg: ", msg)time.sleep(4-msg)return msgif __name__ == "__main__":pool = multiprocessing.Pool(3)results = pool.imap_unordered(func, range(3))for res in results:print("res: ", res)print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join()print("Sub-process(es) done.")# 输出
msg: 0
msg: 1
msg: 2
res: 2
res: 1
res: 0
Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~
Sub-process(es) done.
参考:
1、https://note.qidong.name/2018/11/python-multiprocessing/
2、https://miraachan.github.io/2018/11/20/20/
【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...相关推荐
- python进阶之进程池multiprocessing.Pool
python的进程池multiprocessing.Pool有八个重要函数: apply.apply_async.map.map_async.imap.imap_unordered.starmap.s ...
- Python 进程池 multiprocessing.Pool - Python零基础入门教程
目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...
- python 进程池 等待数量_python 进程池multiprocessing.Pool
44.Python 进程池multiprocessing.Pool 最后更新于:2020-03-21 11:53:37 python进程池Pool 和前面讲解的python线程池 类似,虽然使用多进程 ...
- python 多进程 调用模块内函数_Python进程池multiprocessing.Pool的用法
一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...
- Python进程池multiprocessing.Pool的用法
一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...
- python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例
本文简单介绍python进程模块multiprocessing提供的进程池和线程池功能. 进程池: 进程池的使用有四种方式:apply_async.apply.map_async.map.其中appl ...
- python中的进程池:multiprocessing.Pool()
python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理. 进程池:利用multiprocessing 下的Poo ...
- python进程池multiprocessing.Pool运行错误:The freeze_support() line can be omitted if the program is not g
测试代码如下: 原文:https://blog.csdn.net/xiemanr/article/details/71700531 # -*- coding: utf-8 -*- import mul ...
- python进程池win出错,python进程池multiprocessing.Pool运行错误:
错误: Traceback (most recent call last): File "", line 1, in File "C:\Program Files\Ana ...
最新文章
- Java基础学习——多线程(线程间通信-生产者消费者代码示例)
- 避免在Swift Struct中使用闭包
- python 如何跳过异常继续执行
- STM32之NVIC的深入详解
- HashMap之tableSizeFor
- 云原生推动全云开发与实践
- 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?
- 关于sql中的with(nolock)
- android应用框架与原理之应用框架
- [导入]ASP.NET MVC框架开发系列课程(2):一个简单的ASP.NET MVC应用程序.zip(13.70 MB)...
- jmeter(十六)配置元件之计数器
- php 7 xhprof,php7中使用xhprof解析
- python matpltlib实践——画直方图、折线图
- 什么叫二值化以及二值化的作…
- 计算机有文件无法删除,w7文件夹删不掉如何删掉_win7电脑有的文件夹删不掉怎么办...
- 如何下载微信公众号的音频文件
- 数显之家快讯:「SHIO世硕心语」shio是什么牌子?
- iconfont字体图标以及css字体图标在线制作和使用(推荐)
- 关于jdk11没有jre文件夹
- 鹿定制与国际大牌西服的10点区别?丨新浪官方长微博工具
热门文章
- 著名的菲尔人格测试!听说挺准的
- springboot配置内置tomcat的日志
- 微型计算机温度控制系统,单片机实现PC机温度控制系统方案
- NCC轻量化开发数据结构总结
- 信息检索中的度量precison@k,recall@k,f1@k,MRR,ap,map,CG, DCG,NDCG
- 做wish用多大的虚拟服务器,虚拟海外仓适应于wish,ebay,速卖通,自营平台
- 如何把IDEA中设置像eclipse默认铺开包层次结构
- 基于RFID技术的智能门禁系统设计(控制部分)
- linux修改ipaddr,并保存
- FL Studio乐理教程之调式音阶