python进阶08并发之四map, apply, map_async, apply_async差异
原创博客地址: python进阶08并发之四map, apply, map_async, apply_async差异
差异矩阵
python封装了4种常用方法,用于实现并发
其差异如下
Multi-args | Concurrence | Blocking | Ordered-results | |
---|---|---|---|---|
map | no | yes | yes | yes |
apply | yes | no | yes | no |
map_async | no | yes | no | yes |
apply_async | yes | yes | no | no |
需要注意:map 和 map_async 入参为迭代器类型,可以批量调用。而apply和apply_async只能一个个调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# map results = pool.map(worker, [1, 2, 3])# apply for x, y in [[1, 1], [2, 2]]:results.append(pool.apply(worker, (x, y)))def collect_result(result):results.append(result)# map_async pool.map_async(worker, jobs, callback=collect_result)# apply_async for x, y in [[1, 1], [2, 2]]:pool.apply_async(worker, (x, y), callback=collect_result) |
apply和apply_async
Pool.apply_async:调用立即返回而不是等待结果。AsyncResult返回一个对象。你调用其get()方法以检索函数调用的结果。该get()方法将阻塞直到功能完成。
因此,pool.apply(func, args, kwargs)等效于pool.apply_async(func, args, kwargs).get()。
相比Pool.apply,该Pool.apply_async方法还具有一个回调,则在函数完成时调用该回调。可以使用它来代替get()。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import multiprocessing as mp import timedef foo_pool(x):time.sleep(2)return x*xresult_list = [] def log_result(result):# This is called whenever foo_pool(i) returns a result.# result_list is modified only by the main process, not the pool workers.result_list.append(result)def apply_async_with_callback():pool = mp.Pool()for i in range(10):pool.apply_async(foo_pool, args = (i, ), callback = log_result)pool.close()pool.join()print(result_list)if __name__ == '__main__':apply_async_with_callback() 可能会产生如下结果[1, 0, 4, 9, 25, 16, 49, 36, 81, 64] |
还要注意,可使用调用许多不同的函数Pool.apply_async(并非所有调用都需要使用同一函数)。
相反,Pool.map将相同的函数应用于许多参数。但是,与不同Pool.apply_async,返回结果的顺序与参数的顺序相对应。
参考
Python multiprocessing.Pool: Difference between map, apply, map_async, apply_async
Python-multiprocessing.Pool:何时使用apply,apply_async或map?
python进阶08并发之四map, apply, map_async, apply_async差异相关推荐
- python进阶11并发之七多种并发方式的效率测试
原创博客地址:python进阶11并发之七多种并发方式的效率测试 测试map,apply_async,gevent协程爬虫 测试代码:网页爬虫 函数代码 1 2 3 4 5 6 7 8 9 10 11 ...
- python进阶10并发之六并行化改造
原创博客地址:python进阶10并发之六并行化改造 图示变量含义说明: 1个大step中包含3个小step,大step内部的第一步,二步,三步存在依赖关系(就是内部保持顺序执行) a1,b1,c1, ...
- python进阶07并发之三其他问题
原创博客地址:python进阶07并发之三其他问题 何时使用多进程(线程) 使用多进程or线程,对于python,考虑到GIL锁,基本上默认使用多进程就对了. 除此之外,线程共享全局变量,进程全局变量 ...
- python进阶12并发之八多线程与数据同步
原创博客地址:python进阶12并发之八多线程与数据同步 python并发首选进程,但偶尔有场景进程无法搞定,比如有些变量是无法序列化的,就无法使用工具包manager()的工具类进行共享.如果自己 ...
- python进阶09并发之五生产者消费者
原创博客地址:python进阶09并发之五生产者消费者 这也是实际项目中使用较多的一种并发模式,用Queue(JoinableQueue)实现,是Python中最常用的方式(这里的queue特指mul ...
- python进阶05并发之一基本概念
原创博客地址:python进阶05并发之一基本概念 大多编程语言,一旦涉及并发,都会比较复杂,知识点也较多(大多为历史问题,很多技术点现在非常少使用了,但语言层面也提供支持,对于这些冷门点,只需要知道 ...
- python进阶:闭包、map/reduce/filter函数、lambda函数、装饰器
函数式编程 一.闭包 python一切皆对象 一切皆对象意味着,所有类型均可被赋值,传参~:函数可以当做参数传递,也可以被当做返回值返回:在其他一些语言中函数仅是一段代码块. 闭包的定义与用法 如何验 ...
- Python 进阶之路 (五) map, filter, reduce, zip 一网打尽
简洁的内置函数 大家好,我又回来了,今天我想和大家分享的是Python非常重要的几个内置函数:map,filter,reduce, zip. 它们都是处理序列的便捷函数.这很大程度上归功于函数式编程的 ...
- Python进阶08 异常处理
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 本文特别感谢kylinfish的纠正,相关讨论见留言区. 异常处理 在项目开发中, ...
最新文章
- ssms 缺少索引信息_MySQL3:索引
- 《Starting with Starling》 Ep 1~11
- js 获得明天0点时间戳_需要知道的JS的日期知识,都在这了
- IAR常用快捷键及技巧
- datagrid combobox 选择后显示valueField 而不是 textValue解决方法
- 弦图(Echarts)
- 这本书非常值得一读!《微习惯》读后感
- 【SEU程序设计课笔记】 Mooc - Chapter 6 - (EX) - 泰勒展开求sin(x)/计算PI的近似值
- pycharm安装redis
- linux下hg命令
- PS: Deep Neural Networks Are Easily Fooled___CVPR2015
- XP电脑桌面图标文字带上颜色不透明 解决办法
- Java启动参数(-, -X, -XX参数)详解
- 计算机主板会自动切断电源是怎么回事,告诉你电脑自动断电怎么办
- 面试系列 -- 常见面试问题回答思路
- OpenCV笔记之六(1)——图像处理之图像变换
- 【面试经历】美团2020秋招测试开发一面二面
- 页面展示结果不符合预期
- java 工具类命名_16种java工具类
- ..\USER\stm32f10x.h(428): error: #67: expected a “}“ ADC1_2_IRQn = 18, /*!<