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

Posted

技术标签:

【中文标题】使用 pathos ProcessingPool 的地图时如何设置块大小?【英文标题】:How to set chunk size when using pathos ProcessingPool's map? 【发布时间】:2019-08-31 20:50:18 【问题描述】:

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

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

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

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

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

有什么方法可以在 Pathos 中运行块大小?是否有使用 Patho 其他记录不充分的池实现之一的解决方法?

【问题讨论】:

【参考方案1】:

我是pathos 开发人员。这不是疏忽……在使用pathos.pools.ProcessingPool 时不能使用chunksize。这样做的原因是我想让map 函数与python 的map... 具有相同的接口,并且要做到这一点,基于multiprocessing 实现,我要么必须选择使@ 987654327@ 一个关键字,或者允许*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 以扩展文档。

【讨论】:

感谢您提供如此详细且令人难以置信的快速答案,它有效!我认为chunksize 的提示会大大改进文档。 pathos.readthedocs.io 上没有提到它(至少没有一个通过搜索重新调整)。甚至是Pool 中的map_with_chunksize 方法,或者构造函数中的chunk_size 参数?我了解您在这里的设计选择,但对于我的用例而言,该参数非常重要。 关于文档的观点。实际上,我对文档的决定是完全重用 STL 中的内容,除非我编写了新功能(老实说,这并不算太多)。我可能在十年前写了这些文档,但他们可以重新访问。我将添加一个 GitHub 票以改进文档。

以上是关于使用 pathos ProcessingPool 的地图时如何设置块大小?的主要内容,如果未能解决你的问题,请参考以下文章

Pathos.multiprocessing 的池似乎是非本地的?

使用“pathos.pools.ProcessPool”锁定的规范方法是啥?

如何将关键字列表传递给 pathos.multiprocessing?

如何运行嵌套的、分层的 pathos 多处理地图?

TypeError:“MapResult”对象不可使用 pathos.multiprocessing 进行迭代

pathos:并行处理选项 - 有人可以解释其中的差异吗?