2

根据这个答案,它不是。但这与我迄今为止观察到的情况不一致。考虑以下脚本:

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 包的函数是线程安全的吗?

4

1 回答 1

2

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

如果您增加池大小(例如 to 1000)和样本大小(例如to ),您可以自己看到它50。即使对于较小的SIZE=100000.

于 2017-10-31T18:31:57.440 回答