进程池Pool的imap方法解析

Python中,multiprocessing库中Pool类代表进程池,其对象有imap()和imap_unordered()方法。
两者都用于对大量数据遍历多进程计算,返回一个迭代器(multiprocessing.pool.IMapIterator)。

imap返回结果顺序和输入相同,imap_unordered则为不保证顺序。

经过测试,发现Python多进程和imap()的一些特性:

1、iter = pool.imap(fn, data) 一旦生成,无论使不使用iter,多进程计算都会开始。
计算结果会缓存在内存中,所以要注意内存用尽的问题。

2、fn,即执行函数,不可以是局部对象(不能嵌套在其他函数里),否则会报错:

def fn_outer():
    def fn(a,b):
        return a+b
    pool = Pool()
    pool.imap(fn, [(1,2)])
    pool.close()

AttributeError: Can't pickle local object 'fn_outer.<locals>.fn'

3、使用进程池map数据时,如果每次的运算量很小,最后的效率还不如单进程。这时多进程切换造成的开销已大于多进程计算提升的效率。
这时,可以将输入数据集分段,每次map,计算一段。具体分段多大时获得最佳效率,需要实际测试。

4、注意,Pool使用完毕后必须关闭,否则进程不会退出。
有两种写法,推荐第2种:
注意,第二种中,必须在with的块内使用iter。

pool = Pool()
iter = pool.imap(func, iter)
for ret in iter:
    # do something
pool.close()
with Pool() as pool:
    iter = pool.imap(func, iter)
    for ret in iter:
        # do something
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • python之进程、线程与协程 有这么个例子说他们的区别,帮助理解很有用。 有一个老板想开一个工厂生产手机。 他需...
    道无虚阅读 8,461评论 0 3
  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 8,994评论 0 5
  • PYTHON-进阶-ITERTOOLS模块小结转自wklken:http://wklken.me/posts/20...
    C_Y_阅读 4,741评论 0 2
  • 引言 讲到进程,不得不先说下linux的fork()函数,一个进程调用fork()函数后,系统先给新的进程分配资源...
    StormZhu阅读 5,492评论 0 1
  • 《慢下来,去生活》 快,是一种生活方式。 慢,则是一种生活态度。 随着科技的进步,社会的发展,现代人的视觉和听觉周...
    淡紫色的年华19阅读 2,929评论 0 0

友情链接更多精彩内容