我在使用Pathos的ProcessingPool.map()函数时遇到了低效的并行化:在处理接近尾声时,一个运行缓慢的worker依次处理列表中的最后一个任务,而其他worker则处于空闲状态。我认为这是由于任务列表的“分块”。
当使用Python自己的multiprocessing.Pool时,我可以通过在调用map时强制使用chunksize=1来解决这个问题。然而,Pathos并不支持这种观点,源代码表明这可能是开发人员的疏忽或待办事项:
return _pool.map(star(f), zip(*args)) # chunksize(摘自Pathos‘multiprocessing.py,第137行)
我希望保留Pathos,因为它具有使用lamdbas的能力。
有没有办法在Pathos中运行块大小?是否有使用Patho的其他文档不足的池实现之一的解决方案?
发布于 2019-04-10 22:40:36
我是pathos开发人员。这不是疏忽。使用pathos.pools.ProcessingPool时不能使用chunksize。这样做的原因是,我想让map函数具有与python的map相同的接口……要做到这一点,基于multiprocessing实现,我必须选择将chunksize作为关键字,或者允许*args和**kwds。所以我选择了后者。
如果您想使用chunksize,可以使用_ProcessPool,它保留了原始的multiprocessing.Pool接口,但增加了序列化。
>>> import pathos
>>> p = pathos.pools._ProcessPool()
>>> p.map(lambda x:x*x, range(4), chunksize=10)
[0, 1, 4, 9]
>>> 我很抱歉让您觉得缺少文档。代码主要由python标准库中的multiprocessing分支组成……并且我没有更改复制了功能的文档。例如,我在这里回收STL文档,因为它们的功能是相同的:
>>> p = pathos.pools._ProcessPool()
>>> print(p.map.__doc__)
Equivalent of `map()` builtin
>>> p = multiprocessing.Pool()
>>> print(p.map.__doc__)
Equivalent of `map()` builtin
>>> ..。在我修改了功能的情况下,我确实编写了新的文档:
>>> 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来扩展文档。
https://stackoverflow.com/questions/55611806
复制相似问题