我想问的问题与 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)
这种语法暗示了这一点,但我始终担心并行处理输出的顺序,并且我不想基于未记录的行为编写代码。
答案 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,虽然尚不清楚,但可以通过实施测试来检测。