python进阶之进程池multiprocessing.Pool
python的进程池multiprocessing.Pool有八个重要函数:
apply、apply_async、map、map_async、imap、imap_unordered、starmap、starmap_async
下面是他们的各个比较和区别:
1)apply 和 apply_async:apply 一次执行一个任务,但 apply_async 可以异步执行,因而也可以实现并发
我们使用代码实现下:
apply:
(一个任务执行完再进行下一个任务)
def 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.
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.
2)map 和 map_async 与 apply 和 apply_async 的区别是可以并发执行任务
我们使用代码实现下:
map:
(阻塞到任务列表中所有任务完成再往下执行 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.
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.
3)starmap 和 starmap_async 与 map 和 map_async 的区别是,starmap 和 starmap_async 可以传入多个参数
与二中 map 和 map_async 的区别是,这两个函数可以传入多个参数
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.
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.
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。 不理解的看最下面的一组例子。
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.
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.
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.
总结:
注意:在获取进程池中的结果时,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。
学习自:
https://blog.csdn.net/BobYuan888/article/details/109266020
python进阶之进程池multiprocessing.Pool相关推荐
- python中的进程池:multiprocessing.Pool()
python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理. 进程池:利用multiprocessing 下的Poo ...
- 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运行错误: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】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
1.apply 和 apply_async 一次执行一个任务,但 apply_async 可以异步执行,因而也可以实现并发. 2.map 和 map_async 与 apply 和 apply_asy ...
- python进程池win出错,python进程池multiprocessing.Pool运行错误:
错误: Traceback (most recent call last): File "", line 1, in File "C:\Program Files\Ana ...
最新文章
- 2.2.4 数据的的存储和排列
- 防火墙(5)——五表
- python与正则表达式(part4)--正则表达式分组
- python 类创建
- GDAL打开mdb文件失败解决方法
- Swift-函数学习
- java nlpir_java实现NLPIR(ICTCLAS)分词
- Excel的格式类型
- android.os.FileUriExposedException: file:///storage/emulated/0/market/cache/com.moji.mjweather.apk
- css table 左右滑动和强制不换行
- uniapp H5嵌套通讯方案-webviewiframe
- 精确控制Origin to Word图片格式、大小及主题使用技巧
- DHCP+DHCP中继
- 【Redis集群专题】「集群技术三部曲」介绍一下常用的Redis集群机制方案的原理和指南(入门篇)
- dll系统文件缺失修复工具-DirectX Repair
- 一. pandas入门介绍(一)
- C++ 指向数组的指针
- 深入分析集群安全机制
- python技术开发工程师证书查询_高级工程师证书查询系统
- 微软鼠标支持linux吗,微软发布终端管理应用Windows Terminal新测试版终于支持鼠标进行操作...
热门文章
- 实时获取股票数据,免费!——Python爬虫Sina Stock实战
- python生成单位阵或者对角阵的三种方法
- ios开发html转图片,iOS | PPT 转图片(UIImage) 解决方案
- win10 截屏方法
- 04.ElasticSearch之IK分词器的安装与使用
- 财务报表OCR识别平台案例之安徽征信
- python程序基础网课答案_Python程序设计基础智慧树网课答案
- 超全!52个数据可视化图表鉴赏~~
- 深圳学校积分计算机,深圳市龙岗区小学积分入学排行榜
- android短信分享,android 短信分享