Python - 对numpy.random线程函数的调用是否安全?

时间:2017-10-31 10:29:45

标签: python multithreading python-3.x numpy numpy-random

根据这个answer,事实并非如此。但这与我迄今为止所观察到的并不一致。请考虑以下脚本:

import numpy as np
from multiprocessing.dummy import Pool
from queue import Queue

SIZE=1000000
np.random.seed(1)
tPool = Pool(100)
q1 = Queue()

def worker_thread(i):
    q1.put(np.random.choice(100, 5))

tPool.map(worker_thread, range(SIZE))

q2 = Queue()
np.random.seed(1)
for i in range(SIZE):
    q2.put(np.random.choice(100, 5))

n = 0
for i in range(SIZE):
    n += (q1.get() == (q2.get()))

print(n)

基本上我在这里测试的是,如果 SIZE 调用次数将在多线程环境中生成与单线程环境中相同的序列。对我来说,这将输出n = SIZE。当然这可能只是机会,所以我运行了几次并且一直有一致的结果。所以我的问题是,调用numpy.random包的线程安全函数吗?

1 个答案:

答案 0 :(得分:2)

我在我的机器上多次运行你的脚本,得到999995999992的数组几乎和1000000一样频繁(python 3.5.2,numpy 1.13.3)。所以你所指的答案是正确的:np.random 可能在多线程环境中产生不同的结果。

如果你增加游泳池大小,比如1000和样本大小,你可以自己看看,比如50。即使是较小的SIZE=100000,我也能实现100%的不一致。