DCS*_*DCS 2 python multiprocessing pathos
我ProcessingPool.map()遇到了与Pathos功能低效并行化的问题:在处理结束时,一个缓慢运行的工作人员按顺序处理列表中的最后一个任务,而其他工作人员则空闲。我认为这是由于任务列表的“分块”所致。
使用 Python 自己的时,multiprocessing.Pool我可以通过chunksize=1在调用map. 但是,Pathos 不支持此论点,源代码表明这可能是开发人员的疏忽或待办事项:
return _pool.map(star(f), zip(*args)) # chunksize
Run Code Online (Sandbox Code Playgroud)
(来自 Pathos' multiprocessing.py,第 137 行)
我想保留 Pathos,因为它能够与 lamdbas 一起工作。
有没有办法让块大小在Pathos 中运行?是否有使用 Patho 的其他记录不佳的池实现之一的解决方法?
我是pathos开发者。这不是疏忽……chunksize使用pathos.pools.ProcessingPool. 这样做的原因是,我想让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]
>>>
Run Code Online (Sandbox Code Playgroud)
很抱歉您觉得缺少文档。该代码主要由multiprocessing来自 python 标准库的 fork 组成......并且我没有更改已复制功能的文档。例如,这里我正在回收 STL 文档,因为功能是相同的:
>>> p = pathos.pools._ProcessPool()
>>> print(p.map.__doc__)
Equivalent of `map()` builtin
>>> p = multiprocessing.Pool()
>>> print(p.map.__doc__)
Equivalent of `map()` builtin
>>>
Run Code Online (Sandbox Code Playgroud)
...在我修改功能的情况下,我确实编写了新文档:
>>> 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.
>>>
Run Code Online (Sandbox Code Playgroud)
诚然,文档可能会更好。特别是来自 STL 的文档可以改进。请随时在 GitHub 上添加一张票,或者更好的是添加一个 PR 来扩展文档。