为什么 random.shuffle(Array) 在多个线程中具有相同的 return?我该如何纠正这个问题?

Why does random.shuffle(Array) have the same return across multiple threads? How do I correct this?

以下代码在三个不同的线程中将大量数据随机排列成完全相同的顺序。为什么不是唯一地洗牌?

Settings = json.loads(open('Settings.json', 'r').read())

def update_assets():
        Array = Settings['Location']
        random.shuffle(Array)
        print(Array)

for x in range(3):
    threading.Thread(target = update_assets).start()

三个线程都在洗牌同一个对象。根据线程的调度方式,您可能会看到不同的结果,但所有线程都在洗牌并打印同一个数组。

如果您想看到三个不同的结果,您应该复制三份,例如:

def update_assets(locs):
    random.shuffle(locs)
    print(locs)

for x in range(3):
    threading.Thread(target = update_assets,
                     args = (Settings['Location'][:],)).start()

random.shuffle 使用一个在所有线程之间共享的全局随机生成器实例。但是,Python's RNG appears to be thread safe,所以这并不能说明问题的全部。

问题的另一个方面是 Array 同样是跨所有线程共享的全局数据。但是洗牌(就地发生)和这个数组的打印输出在线程之间不同步,导致竞争条件(当两个线程对 Array 的内容有不同的看法时)。

要解决此问题,请在每个进程中复制 Array,然后再在该进程中对其进行洗牌 - 请记住 shuffle 对其内容进行就地洗牌。