joblib.Parallel 是不是保持传递数据的原始顺序?

Posted

技术标签:

【中文标题】joblib.Parallel 是不是保持传递数据的原始顺序?【英文标题】:Does joblib.Parallel keep the original order of data passed?joblib.Parallel 是否保持传递数据的原始顺序? 【发布时间】:2019-11-01 16:46:47 【问题描述】:

我想问同样的问题 Python 3: does Pool keep the original order of data passed to map? 用于工作库。例如:

Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in x)

语法有点暗示,但我总是担心并行处理的输出顺序,我不想根据未记录的行为编写代码。

【问题讨论】:

【参考方案1】:

TL;DR - 它保留了两个后端的顺序。

扩展@Chris Farr 的答案,我实施了一个简单的测试。我让一个函数等待一些随机的时间(您可以检查这些等待时间是否不相同)。我知道每次都保留订单,两个后端都保留。

from joblib import Parallel, delayed
import numpy as np
import time

def f(wait):
    time.sleep(wait)
    return wait

n = 50
waits = np.random.uniform(low=0, high=1, size=n)
res = Parallel(n_jobs=8, backend='multiprocessing')(delayed(f)(wait) for wait in waits)
np.all(res == waits)

【讨论】:

【参考方案2】:

Per the joblib documentation 您可以将backend 指定为multiprocessing,它基于multiprocessing.Pool。然后另一个答案将适用于结果实际上是有序的。

Parallel(n_jobs=2, backend="multiprocessing")(delayed(sqrt)(i ** 2) for i in x)

然而,默认情况下,他们使用loky,虽然不是很清楚,但可以通过实施测试来检测。

【讨论】:

以上是关于joblib.Parallel 是不是保持传递数据的原始顺序?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 joblib.Parallel 时保护主循环很重要?

在 joblib `Parallel` 上下文中腌制 `matlab` 对象时出错

即使添加了“如果 __name__ == '__main__':”,Windows 上的 python joblib Parallel 也无法正常工作

Python 3:Pool 是不是保持传递给 map 的原始数据顺序?

编辑表单不起作用,数据正在传递到服务器但不是 httpPost 方法

glUniform*fv 是不是保留传递的缓冲区?