使用 pathos ProcessingPool 的映射时如何设置块大小?

How to set chunk size when using pathos ProcessingPool's map?

我 运行 与 Pathos 的 ProcessingPool.map() 函数并行化效率低下:在处理结束时,一个缓慢的 运行 worker 按顺序处理列表中的最后一个任务而其他工人则闲着。我认为这是由于任务列表的"chunking"。

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

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

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

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

有什么方法可以获取 Pathos 中的块大小 运行?是否有使用 Patho 的其他文档不足的池实现之一的解决方法?

我是 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 来扩展文档。