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

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

最佳答案

我已经在我的机器上运行了你的脚本多次,并获得了 999995999992 的数组,几乎与 1000000 一样频繁(python 3.5 .2,numpy 1.13.3)。因此,您引用的答案是正确的:np.random 可能在多线程环境中产生不同的结果。

如果您增加池大小(例如 1000)和样本大小(例如 50),您可以自己看到它。即使对于较小的 SIZE=100000,我也能够实现 100% 的不一致。

关于Python - 对 numpy.random 函数的调用线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47033093/

相关文章:

python - 如何在 Python 的集合列表中找到并集?

c# - 如何使用新的任务并行库确保两个任务在不同的线程甚至不同的处理器上运行?

python - 有没有办法删除字符串中标点符号的特定组合?

python - 如何使用正则表达式提取第二个字符串(空格后)?

java - 同步,不总是正确的?

python - python 3(python 3.1,python 3k,python3000)中内置函数的两个相互矛盾的含义

python - 将选择分组依据的结果复制到表中

python - 调整图片大小,仅在中心周围显示100x100像素

python - 从 pandas Dataframe 中的混合 dtype 列中删除破折号字符串

javascript - javascript 可以一次运行多个函数吗?