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

时间:2019-07-30 20:11:28

标签: python multiprocessing joblib

我有许多工作要做,每个过程最多可能需要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()时都会生成一个新的数字?

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

1 个答案:

答案 0 :(得分:1)

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

这只能在带有fork的平台上发生。工人们从父母的状态副本开始。