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



我在使用 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 以扩展文档。

相关内容

  • 没有找到相关文章

最新更新