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

use*_*167 13 python multiprocessing joblib

我想问和Python 3一样的问题 :Pool 是否保持传递给 map 的数据的原始顺序?对于joblib。例如:

Parallel(n_jobs=2)(delayed(sqrt)(i ** 2) for i in x)
Run Code Online (Sandbox Code Playgroud)

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

Yai*_*aon 23

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)
Run Code Online (Sandbox Code Playgroud)


Chr*_*arr 9

每JOBLIB文档,你可以指定backendmultiprocessing这是基于multiprocessing.Pool。然后另一个答案将适用于结果实际上是有序的。

Parallel(n_jobs=2, backend="multiprocessing")(delayed(sqrt)(i ** 2) for i in x)
Run Code Online (Sandbox Code Playgroud)

然而,默认情况下,他们使用loky并且它不是立即明确的,但可以通过实施测试来检测到。

  • 我对 loky 后端的测试表明它也按顺序返回结果。 (2认同)