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

DCS*_*DCS 2 python multiprocessing pathos

ProcessingPool.map()遇到了与Pathos功能低效并行化的问题:在处理结束时,一个缓慢运行的工作人员按顺序处理列表中的最后一个任务,而其他工作人员则空闲。我认为这是由于任务列表的“分块”所致。

使用 Python 自己的时,multiprocessing.Pool我可以通过chunksize=1在调用map. 但是,Pathos 不支持此论点,源代码表明这可能是开发人员的疏忽或待办事项:

return _pool.map(star(f), zip(*args)) # chunksize
Run Code Online (Sandbox Code Playgroud)

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

我想保留 Pathos,因为它能够与 lamdbas 一起工作。

有没有办法让块大小在Pathos 中运行?是否有使用 Patho 的其他记录不佳的池实现之一的解决方法?

Mik*_*rns 6

我是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]
>>> 
Run Code Online (Sandbox Code Playgroud)

很抱歉您觉得缺少文档。该代码主要由multiprocessing来自 python 标准库的 fork 组成......并且我没有更改已复制功能的文档。例如,这里我正在回收 STL 文档,因为功能是相同的:

>>> p = pathos.pools._ProcessPool()
>>> print(p.map.__doc__)

        Equivalent of `map()` builtin

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

        Equivalent of `map()` builtin
>>>    
Run Code Online (Sandbox Code Playgroud)

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

>>> 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.

>>> 
Run Code Online (Sandbox Code Playgroud)

诚然,文档可能会更好。特别是来自 STL 的文档可以改进。请随时在 GitHub 上添加一张票,或者更好的是添加一个 PR 来扩展文档。