我在使用 Pathos 的ProcessingPool.map()
函数时遇到了低效的并行化:在处理即将结束时,一个运行缓慢的工作线程按顺序处理列表中的最后一个任务,而其他工作线程处于空闲状态。我认为这是由于任务列表的"分块"。
使用 Python 自己的multiprocessing.Pool
时,我可以通过在调用map
时强制chunksize=1
来解决此问题。然而,Pathos不支持这个论点,源代码表明这可能是开发人员的疏忽或待办事项:
return _pool.map(star(f), zip(*args)) # chunksize
(摘自《悲怆multiprocessing.py
》第137行)
我想保留Pathos,因为它能够与lamdbas一起工作。
有没有办法让块大小在 Pathos 中运行?使用 Patho 其他文档记录不佳的池实现之一是否有解决方法?
我是pathos
开发人员。 这不是疏忽...使用pathos.pools.ProcessingPool
时不能使用chunksize
。 这样做的原因是我想让map
函数具有与 pythonmap
相同的接口......为此,基于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 以扩展文档。