我正在使用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其他记录较差的池实现之一解决此问题?
答案 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上添加票证以扩展文档。