使用pathos ProcessingPool的地图时如何设置块大小?

时间:2019-04-10 11:47:36

标签: python multiprocessing pathos

我正在使用Pathos的ProcessingPool.map()函数进行低效的并行化:在处理快要结束时,一个运行缓慢的工作程序将依次处理列表中的最后一个任务,而其他工作程序则处于空闲状态。我认为这是由于任务列表的“分块”。

使用Python自己的multiprocessing.Pool时,我可以通过在调用chunksize=1时强制map来解决此问题。但是,Pathos不支持此参数,并且源代码表明这可能是开发人员方面的疏忽或待办事项:

return _pool.map(star(f), zip(*args)) # chunksize

(来自Pathos的multiprocessing.py,第137行)

我想保留Pathos,因为它可以与lamdbas一起使用。

有什么办法可以在Pathos中运行块大小?是否可以使用Patho其他记录较差的池实现之一解决此问题?

1 个答案:

答案 0 :(得分:1)

我是pathos开发人员。这不是疏忽……使用chunksize时不能使用pathos.pools.ProcessingPool。这样做的原因是,我想让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上添加票证以扩展文档。