joblib.Parallel 正在重复使用生成的数字,而不是为每个过程重做

joblib.Parallel is reusing generated numbers instead of redoing for each process

我有很多流程要做,每个流程最多可能需要 20 分钟,并且会使用 100% CPU。我是多处理的新手,我决定使用 joblib,因为它似乎让我在没有线程的情况下进行多处理(我有 12 个内核,想一次处理 12 个进程,在旧进程完成时启动新进程,但我无法得到这适用于 Pool 或 mp.Process).

我是 运行 python2.7,我重新创建了一个简单版本的正在发生的事情。

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


def do_something():
    print np.random.choice([0, 1])
    sleep(3)


if __name__ == '__main__':
    Parallel(n_jobs=3, backend='multiprocessing')(delayed(do_something)() for n in xrange(30))

输出总是以三个为一组,'1 1 1' 或 '0 0 0',因此仅为第一个过程生成数字。我认为 joblib.Parallel 只需调用该函数 30 次,并使用 3 个内核。

有没有办法让它在每次调用 do_something() 时生成一个新数字?

** 编辑:显然这就是随机生成器的工作方式;他们使用您计算机上的时间戳。当您并行调用时,所有工作人员的调用时间都相同,因此他们都会生成相同的号码。因为我知道在我的真实代码中该函数将被调用多少次,所以我通过预先生成一个随机数列表并在每次调用时从该列表中提取来解决这个问题。

您需要重新初始化每个工作器中的随机数生成器。您可以通过使用合适的随机输入调用 numpy.random.seed 来完成此操作。获取这样的输入不是一个小问题。但是从内核接口之一获取它并不被认为是不正确的。

这只会发生在有 fork 的平台上。工作人员从他们 parent 的状态副本开始。