Maison >développement back-end >Tutoriel Python >Comment puis-je utiliser efficacement les tableaux NumPy dans la mémoire partagée pour le multitraitement en Python ?
Utilisation de tableaux numpy en mémoire partagée pour le multitraitement
L'utilisation de tableaux numpy en mémoire partagée est essentielle pour des tâches multitraitements efficaces. Le module multiprocessing fournit un moyen simple de répartir les charges de travail entre plusieurs processus, mais la gestion des tableaux numpy partagés entre ces processus pose des problèmes.
Dans l'extrait de code fourni, une tentative de partage d'un tableau numpy à l'aide de la classe multiprocessing.Array est fait. Bien que cela permette d'accéder à des éléments individuels du tableau, il ne prend pas entièrement en charge les opérations de tableau numpy.
Pour résoudre ce problème, envisagez d'utiliser la méthode shared_arr.get_lock() pour garantir un accès synchronisé si nécessaire :
def f(i): with shared_arr.get_lock(): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
Cette méthode garantit qu'un seul processus peut modifier le tableau partagé à un moment donné, préservant ainsi l'intégrité des données.
Une approche alternative qui élimine le besoin de synchronisation explicite est :
def f(i): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
Cela fonctionne car le GIL (Global Interpreter Lock) de Python applique le monothreading pour toutes les exécutions de bytecode Python, y compris le code numpy. Le GIL garantit qu'un seul thread d'exécution peut accéder à la mémoire partagée à la fois.
Enfin, envisagez d'utiliser la classe multiprocessing.sharedctypes.RawArray si l'accès synchronisé n'est pas requis. RawArray ne fournit aucun mécanisme de synchronisation, ce qui le rend adapté aux scénarios dans lesquels des mécanismes de verrouillage personnalisés sont implémentés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!