使用 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 来扩展文档。
我 运行 与 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 来扩展文档。