作业库并行是重用生成的数字,而不是为每个进程重做

2024-04-25 22:07:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多进程要做,每一个进程可能需要20分钟,并使用100%的CPU。我是新的多处理,我决定使用joblib,因为它似乎让我多处理没有线程(我有12个核心,并希望做12个进程,开始新的旧的完成,我不能让这与池或线程)mp工艺). 你知道吗

我正在运行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))

输出总是以3为一组,即“1 1”或“0 0 0”,因此仅为第一个进程生成数字。我以为作业库并行只需分别调用函数30次,并使用3个内核即可。你知道吗

有没有办法使它在每次调用do\u something()时生成一个新的数字?你知道吗

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


Tags: fromimport列表进程parallelnp时间数字
1条回答
网友
1楼 · 发布于 2024-04-25 22:07:57

您需要在每个worker中重新初始化随机数生成器。您可以通过使用适当的随机输入调用numpy.random.seed来实现这一点。获得这样的投入不是一个小问题。但是从一个内核接口获取它并不被认为是不正确的。你知道吗

这只能在带有fork的平台上发生。工人们从一份他们父母的状态开始。你知道吗

相关问题 更多 >