python numpy数组操作+ =线程安全吗?

Már*_*sta 5 python arrays multithreading numpy

我如何确定此代码是线程安全的?

import numpy as np
from threading import Thread

n_threads = 5

ones = np.ones((5, 5))
A = np.ones((5, 5))

def my_function():
    global A
    for i in range(250):
        A += ones # is += thread safe ?

threads = [Thread(target=my_function) for i in range(n_threads)]

for t in threads:
    t.start()

for t in threads:
    t.join()

print(A)
Run Code Online (Sandbox Code Playgroud)

A应该是重要的共享内存吗?令人惊讶的是,我总是得到相同的结果,并且数组的所有条目都具有相同的值。我希望线程能够更新矩阵的值,并且会丢失一些...

谢谢。

Joh*_*nck 3

您的代码不安全。一些 NumPy ufunc(例如隐式使用的 add())可以释放 GIL。您在玩具示例中从未看到任何问题的原因可能是它运行的时间很短并且数据量非常小。您也可能通过计算的简单性质来避免问题,但我想您的实际代码更复杂。

简而言之,如果没有锁定,您就无法在多个线程中执行操作。对于这样的代码,锁定可能会破坏多线程的目的。