1、applyapply_async 一次执行一个任务,但 apply_async 可以异步执行,因而也可以实现并发。

2、map 和 map_asyncapply 和 apply_async 的区别是可以并发执行任务。

3、starmap 和 starmap_asyncmap 和 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...相关推荐

  1. python进阶之进程池multiprocessing.Pool

    python的进程池multiprocessing.Pool有八个重要函数: apply.apply_async.map.map_async.imap.imap_unordered.starmap.s ...

  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()

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

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

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

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

最新文章

  1. Java基础学习——多线程(线程间通信-生产者消费者代码示例)
  2. 避免在Swift Struct中使用闭包
  3. python 如何跳过异常继续执行
  4. STM32之NVIC的深入详解
  5. HashMap之tableSizeFor
  6. 云原生推动全云开发与实践
  7. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?
  8. 关于sql中的with(nolock)
  9. android应用框架与原理之应用框架
  10. [导入]ASP.NET MVC框架开发系列课程(2):一个简单的ASP.NET MVC应用程序.zip(13.70 MB)...
  11. jmeter(十六)配置元件之计数器
  12. php 7 xhprof,php7中使用xhprof解析
  13. python matpltlib实践——画直方图、折线图
  14. 什么叫二值化以及二值化的作…
  15. 计算机有文件无法删除,w7文件夹删不掉如何删掉_win7电脑有的文件夹删不掉怎么办...
  16. 如何下载微信公众号的音频文件
  17. 数显之家快讯:「SHIO世硕心语」shio是什么牌子?
  18. iconfont字体图标以及css字体图标在线制作和使用(推荐)
  19. 关于jdk11没有jre文件夹
  20. 鹿定制与国际大牌西服的10点区别?丨新浪官方长微博工具

热门文章

  1. 著名的菲尔人格测试!听说挺准的
  2. springboot配置内置tomcat的日志
  3. 微型计算机温度控制系统,单片机实现PC机温度控制系统方案
  4. NCC轻量化开发数据结构总结
  5. 信息检索中的度量precison@k,recall@k,f1@k,MRR,ap,map,CG, DCG,NDCG
  6. 做wish用多大的虚拟服务器,虚拟海外仓适应于wish,ebay,速卖通,自营平台
  7. 如何把IDEA中设置像eclipse默认铺开包层次结构
  8. 基于RFID技术的智能门禁系统设计(控制部分)
  9. linux修改ipaddr,并保存
  10. FL Studio乐理教程之调式音阶