/ / Est-ce que l'opération de tableau python numpy + = thread est sécurisée? - python, tableaux, multithreading, numpy

Est-ce que l'opération de tableau python numpy + = thread est sécurisée? - python, tableaux, multithreading, numpy

Comment puis-je être sûr que ce code est thread-safe?

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)

Est-ce que A devrait être une mémoire partagée critique? Étonnamment, j'obtiens toujours le même résultat et toutes les entrées du tableau ont la même valeur. Je m'attendrais à ce que les threads mettent à jour les valeurs de la matrice, et que certains soient perdus ...

Merci.

Réponses:

0 pour la réponse № 1

Votre code n'est pas sécurisé. Certaines fonctions numériques (comme add () que vous utilisez implicitement) peuvent libérer le GIL. La raison pour laquelle vous ne voyez jamais de problèmes dans votre exemple de jouet est probablement parce qu'il dure trop peu de temps et que la taille des données est très petite. Vous pouvez également éviter les problèmes en raison de la nature simple de vos calculs, mais j'imagine que votre code réel est plus complexe.

En bref, vous ne pouvez pas faire ce que vous faites dans plusieurs threads sans verrouillage. Et le verrouillage va probablement annuler l'objectif de plusieurs threads pour un code comme celui-ci.