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相关推荐

  1. python中的进程池:multiprocessing.Pool()

    python中的进程池: 我们可以写出自己希望进程帮助我们完成的任务,然后把任务批量交给进程池 进程池帮助我们创建进程完成任务,不需要我们管理. 进程池:利用multiprocessing 下的Poo ...

  2. Python 进程池 multiprocessing.Pool - Python零基础入门教程

    目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...

  3. python 进程池 等待数量_python 进程池multiprocessing.Pool

    44.Python 进程池multiprocessing.Pool 最后更新于:2020-03-21 11:53:37 python进程池Pool 和前面讲解的python线程池 类似,虽然使用多进程 ...

  4. python 多进程 调用模块内函数_Python进程池multiprocessing.Pool的用法

    一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...

  5. Python进程池multiprocessing.Pool的用法

    一.multiprocessing模块 multiprocessing模块提供了一个Process类来代表一个进程对象,multiprocessing模块像线程一样管理进程,这个是multiproce ...

  6. python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例

    本文简单介绍python进程模块multiprocessing提供的进程池和线程池功能. 进程池: 进程池的使用有四种方式:apply_async.apply.map_async.map.其中appl ...

  7. 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 ...

  8. 【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 ...

  9. python进程池win出错,python进程池multiprocessing.Pool运行错误:

    错误: Traceback (most recent call last): File "", line 1, in File "C:\Program Files\Ana ...

最新文章

  1. 2.2.4 数据的的存储和排列
  2. 防火墙(5)——五表
  3. python与正则表达式(part4)--正则表达式分组
  4. python 类创建
  5. GDAL打开mdb文件失败解决方法
  6. Swift-函数学习
  7. java nlpir_java实现NLPIR(ICTCLAS)分词
  8. Excel的格式类型
  9. android.os.FileUriExposedException: file:///storage/emulated/0/market/cache/com.moji.mjweather.apk
  10. css table 左右滑动和强制不换行
  11. uniapp H5嵌套通讯方案-webviewiframe
  12. 精确控制Origin to Word图片格式、大小及主题使用技巧
  13. DHCP+DHCP中继
  14. 【Redis集群专题】「集群技术三部曲」介绍一下常用的Redis集群机制方案的原理和指南(入门篇)
  15. dll系统文件缺失修复工具-DirectX Repair
  16. 一. pandas入门介绍(一)
  17. C++ 指向数组的指针
  18. 深入分析集群安全机制
  19. python技术开发工程师证书查询_高级工程师证书查询系统
  20. 微软鼠标支持linux吗,微软发布终端管理应用Windows Terminal新测试版终于支持鼠标进行操作...

热门文章

  1. 实时获取股票数据,免费!——Python爬虫Sina Stock实战
  2. python生成单位阵或者对角阵的三种方法
  3. ios开发html转图片,iOS | PPT 转图片(UIImage) 解决方案
  4. win10 截屏方法
  5. 04.ElasticSearch之IK分词器的安装与使用
  6. 财务报表OCR识别平台案例之安徽征信
  7. python程序基础网课答案_Python程序设计基础智慧树网课答案
  8. 超全!52个数据可视化图表鉴赏~~
  9. 深圳学校积分计算机,深圳市龙岗区小学积分入学排行榜
  10. android短信分享,android 短信分享