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)
每JOBLIB文档,你可以指定backend为multiprocessing这是基于multiprocessing.Pool。然后另一个答案将适用于结果实际上是有序的。
Parallel(n_jobs=2, backend="multiprocessing")(delayed(sqrt)(i ** 2) for i in x)
Run Code Online (Sandbox Code Playgroud)
然而,默认情况下,他们使用loky并且它不是立即明确的,但可以通过实施测试来检测到。