首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用pathos ProcessingPool的map时设置块大小?

如何在使用pathos ProcessingPool的map时设置块大小?
EN

Stack Overflow用户
提问于 2019-04-10 19:47:36
回答 1查看 524关注 0票数 2

我在使用Pathos的ProcessingPool.map()函数时遇到了低效的并行化:在处理接近尾声时,一个运行缓慢的worker依次处理列表中的最后一个任务,而其他worker则处于空闲状态。我认为这是由于任务列表的“分块”。

当使用Python自己的multiprocessing.Pool时,我可以通过在调用map时强制使用chunksize=1来解决这个问题。然而,Pathos并不支持这种观点,源代码表明这可能是开发人员的疏忽或待办事项:

代码语言:javascript
复制
return _pool.map(star(f), zip(*args)) # chunksize

(摘自Pathos‘multiprocessing.py,第137行)

我希望保留Pathos,因为它具有使用lamdbas的能力。

有没有办法在Pathos中运行块大小?是否有使用Patho的其他文档不足的池实现之一的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-10 22:40:36

我是pathos开发人员。这不是疏忽。使用pathos.pools.ProcessingPool时不能使用chunksize。这样做的原因是,我想让map函数具有与python的map相同的接口……要做到这一点,基于multiprocessing实现,我必须选择将chunksize作为关键字,或者允许*args**kwds。所以我选择了后者。

如果您想使用chunksize,可以使用_ProcessPool,它保留了原始的multiprocessing.Pool接口,但增加了序列化。

代码语言:javascript
复制
>>> import pathos
>>> p = pathos.pools._ProcessPool() 
>>> p.map(lambda x:x*x, range(4), chunksize=10)
[0, 1, 4, 9]
>>> 

我很抱歉让您觉得缺少文档。代码主要由python标准库中的multiprocessing分支组成……并且我没有更改复制了功能的文档。例如,我在这里回收STL文档,因为它们的功能是相同的:

代码语言:javascript
复制
>>> p = pathos.pools._ProcessPool()
>>> print(p.map.__doc__)

        Equivalent of `map()` builtin

>>> p = multiprocessing.Pool()
>>> print(p.map.__doc__)

        Equivalent of `map()` builtin
>>>    

..。在我修改了功能的情况下,我确实编写了新的文档:

代码语言:javascript
复制
>>> p = pathos.pools.ProcessPool()
>>> print(p.map.__doc__)
run a batch of jobs with a blocking and ordered map

Returns a list of results of applying the function f to the items of
the argument sequence(s). If more than one sequence is given, the
function is called with an argument list consisting of the corresponding
item of each sequence.

>>> 

诚然,文档可以做得更好。特别是来自STL的文档可以改进。请随时在GitHub上添加工单,或者更好的是,添加PR来扩展文档。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55611806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档