Python 多处理中不同工人的相同输出

Python 多处理中不同工人的相同输出,python,parallel-processing,multiprocessing,Python,Parallel Processing,Multiprocessing,我有一些非常简单的案例,可以将要完成的工作分解并分配给工人。我尝试了一个非常简单的多处理示例: 上述程序产生以下输出: Input : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 7 1 7 2 7 5 7 3 7 4 7 6 7 7 7 8 6 9 6 Pool : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 为什么要打印相同的随机数?(我的机器中有4个CPU)。这是最好的/最简单的方法吗?我认为您需要在do\u计算中使用随机数生成

我有一些非常简单的案例,可以将要完成的工作分解并分配给工人。我尝试了一个非常简单的多处理示例:

上述程序产生以下输出:

Input   : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0 7
1 7
2 7
5 7
3 7
4 7
6 7
7 7
8 6
9 6
Pool    : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

为什么要打印相同的随机数?(我的机器中有4个CPU)。这是最好的/最简单的方法吗?

我认为您需要在
do\u计算中使用随机数生成器重新设定种子

我的猜测是,当您导入模块时,随机数生成器(RNG)会被植入种子。然后,当您使用多处理时,您将当前进程与已种子化的RNG分叉——因此,您的所有进程都共享相同的RNG种子值,因此它们将生成相同的数字序列

e、 g:

这提供了使用numpy.random和multi-processing时的一个好的和坏的实践示例。更重要的是了解伪随机数生成器(PRNG)的种子是何时创建的:

将numpy导入为np
导入pprint
来自多处理导入池
pp=pprint.PrettyPrinter()
def不良实践(索引):
返回np.random.randint(0,10,size=10)
def良好实践(索引):
返回np.random.RandomState().randint(0,10,size=10)
p=池(5)
pp.pprint(“不良做法:”)
pp.pprint(p.map(不良实践,范围(5)))
pp.pprint(“良好做法:”)
pp.pprint(p.map(良好实践,范围(5)))
输出:

在良好做法中,每个线程创建一次种子,而在不良做法中,在导入numpy.random模块时,仅创建一次种子。

以下是我使用的内容(可能需要更新版本的numpy):

输出:

[array([4, 9, 5, 9, 2, 8, 3, 3, 5, 9]), 
 array([0, 4, 1, 0, 6, 5, 3, 1, 7, 9]), 
 array([7, 0, 7, 7, 1, 0, 1, 3, 9, 6]), 
 array([8, 7, 9, 9, 1, 7, 4, 0, 5, 2]), 
 array([9, 0, 8, 9, 3, 8, 6, 6, 7, 9])]

这本书实际上相当有用

你能告诉我如何把
种子
放入
计算中
吗。如果我把
seed
放在
main
中,我仍然会得到类似的输出。@imsc--对不起,我读得不够仔细。您需要
np.random.seed
(而不是
random.seed
)。我已经相应地更新了。@imsc-你确定吗?我可以在我的笔记本电脑上重现您的原始行为(只有2个内核),但添加
np.random.seed()
后效果会更好。另一个可能会让这个问题变得更复杂的因素是
pool\u size=multiprocessing.cpu\u count()*2
。也许可以尝试使用
cpu\u count()
。你不会真的得到更多的使用,反正我不会认为…谢谢。以前我在计算随机数后放入种子。@imsc--Whoops,就这样了:)的可能重复是否无法为每个可能使用随机数的进程设置随机数?假设一个人使用模块random、numpy、scipy、tensorflow,谁知道还有什么。是否只有这样才能确保流程有不同的随机种子来执行这些操作并手动设置状态?另外:
def do_calculation(data):
    np.random.seed()
    rand=np.random.randint(10)
    print data, rand
    return data * 2
'Bad practice: '
[array([4, 2, 8, 0, 1, 1, 6, 1, 2, 9]),
 array([4, 2, 8, 0, 1, 1, 6, 1, 2, 9]),
 array([4, 2, 8, 0, 1, 1, 6, 1, 2, 9]),
 array([4, 2, 8, 0, 1, 1, 6, 1, 2, 9]),
 array([4, 2, 8, 0, 1, 1, 6, 1, 2, 9])]
'Good practice: '
[array([8, 9, 4, 5, 1, 0, 8, 1, 5, 4]),
 array([5, 1, 3, 3, 3, 0, 0, 1, 0, 8]),
 array([1, 9, 9, 9, 2, 9, 4, 3, 2, 1]),
 array([4, 3, 6, 2, 6, 1, 2, 9, 5, 2]),
 array([6, 3, 5, 9, 7, 1, 7, 4, 8, 5])]
import numpy as np
from multiprocessing import Pool

entropy = 42
seed_sequence = np.random.SeedSequence(entropy)

number_processes = 5

seeds = seed_sequence.spawn(number_processes)

def good_practice(seed):
    rng = np.random.default_rng(seed)
    return rng.integers(0,10,size=10)

pool = Pool(number_processes)


print(pool.map(good_practice, seeds))
[array([4, 9, 5, 9, 2, 8, 3, 3, 5, 9]), 
 array([0, 4, 1, 0, 6, 5, 3, 1, 7, 9]), 
 array([7, 0, 7, 7, 1, 0, 1, 3, 9, 6]), 
 array([8, 7, 9, 9, 1, 7, 4, 0, 5, 2]), 
 array([9, 0, 8, 9, 3, 8, 6, 6, 7, 9])]