使用 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?