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

时间:2019-06-19 02:34:32

标签: python multiprocessing joblib

我想问的问题与 Python 3: does Pool keep the original order of data passed to map? for joblib。例如:

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

这种语法暗示了这一点,但我始终担心并行处理输出的顺序,并且我不想基于未记录的行为编写代码。

2 个答案:

答案 0 :(得分:12)

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

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

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

def f(i, r):
    np.random.seed(r)
    wait = np.random.randint(200)
    time.sleep(wait/100)
    return i, wait

n = 100
rand = np.random.randint(low=19, high=19+n, size=n)
inputs = zip(range(n), rand)
res = Parallel(n_jobs=4, backend='loky')(delayed(f)(*pair) for pair in inputs)
res = np.vstack(res)
np.all(res[:,0] == np.arange(n))

答案 1 :(得分:1)

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

multiprocessing.Pool

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

相关问题