Maison >développement back-end >Tutoriel Python >Comment puis-je utiliser les tableaux NumPy dans la mémoire partagée pour le multitraitement en Python ?
Utilisation de tableaux NumPy dans la mémoire partagée pour le multitraitement
Lorsque vous travaillez avec le multitraitement en Python, le partage de tableaux entre processus peut être difficile. L'utilisation d'un tableau NumPy en multitraitement peut présenter des difficultés si vous exigez qu'il se comporte comme un tableau NumPy plutôt que comme un simple tableau ctypes.
Énoncé du problème
Dans l'exemple fourni , le tableau NumPy est enveloppé dans un objet ctypes Array(). Bien que cela permette d'accéder au tableau à la manière des ctypes, cela perd la fonctionnalité d'un tableau NumPy. Des opérations telles que -1*arr ou arr.sum() ne peuvent pas être effectuées, et le reconvertir en tableau NumPy briserait la mémoire partagée.
Solution utilisant shared_arr.get_lock()
Pour conserver la fonctionnalité du tableau NumPy tout en utilisant une matrice de mémoire partagée, vous pouvez utiliser la méthode get_lock() disponible à partir d'une matrice de mémoire partagée. array :
shared_arr = mp.Array(ctypes.c_double, N) def f(i): with shared_arr.get_lock(): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
En utilisant la méthode get_lock(), vous pouvez synchroniser l'accès au tableau partagé et vous assurer qu'il est accessible comme un tableau NumPy au sein du processus.
Exemple
Le code suivant offre un exemple amélioré qui conserve la fonctionnalité de tableau NumPy tout en utilisant le partage mémoire :
import multiprocessing as mp import numpy as np N = 100 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Fill the shared array with random values arr[:] = np.random.uniform(size=N) # Create a pool of processes with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool: # Define functions that modify the shared array def f(i): with shared_arr.get_lock(): arr -= 1 # Subtract 1 from each array element within the process pool.map(f, range(N)) # Check the modified shared array assert np.allclose(arr, -1)
Dans cet exemple, la fonction init() configure le shared_arr pour chaque processus, et la fonction f() opère sur le tableau partagé dans le verrou. Le tableau partagé modifié est alors accessible par le processus principal après avoir rejoint le pool. Cette méthode fournit un moyen synchronisé et compatible avec NumPy d'utiliser un tableau partagé en multitraitement.
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!