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 ?

Comment puis-je utiliser les tableaux NumPy dans la mémoire partagée pour le multitraitement en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-06 08:08:101020parcourir

How Can I Use NumPy Arrays in Shared Memory for Multiprocessing in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn