Heim  >  Artikel  >  Backend-Entwicklung  >  Kann Multiprocessing schreibgeschützte freigegebene Daten ohne Replikation teilen?

Kann Multiprocessing schreibgeschützte freigegebene Daten ohne Replikation teilen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-25 02:46:30154Durchsuche

Can Multiprocessing Share Read-Only Shared Data Without Replication?

Repliziert Multiprocessing schreibgeschützte freigegebene Daten?

Einführung

In Multiprocessing-Szenarien ist es entscheidend, die Ressourcennutzung zu optimieren, indem sichergestellt wird, dass gemeinsam genutzte Daten vorhanden sind nicht über mehrere Prozesse hinweg dupliziert. Wenn Sie verstehen, wie in diesen Situationen mit schreibgeschützten Daten umgegangen wird, können Sie erheblichen Speicher- und Leistungsaufwand einsparen.

Frage

Betrachten Sie den folgenden Python-Code:

<code class="python">glbl_array = # a 3 Gb array

def my_func(args, def_param=glbl_array):
    # do stuff on args and def_param

if __name__ == '__main__':
    pool = Pool(processes=4)
    pool.map(my_func, range(1000))</code>

Können wir garantieren? Oder fördern Sie, dass die verschiedenen Prozesse das glbl_array gemeinsam nutzen, ohne einzelne Kopien zu erstellen?

Antwort

Um den gemeinsamen Zugriff ohne Duplizierung sicherzustellen, können wir den Shared-Memory-Mechanismus nutzen, der vom Multiprocessing-Modul in Python bereitgestellt wird. So kann es implementiert werden:

<code class="python">import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10 * 10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i, :] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print(shared_array)</code>

Implementierungsdetails

Der Code erstellt ein Shared-Memory-Array (shared_array_base) mithilfe der Klasse multiprocessing.Array. Anschließend wird es zur bequemen Bearbeitung in ein Numpy-Array (shared_array) konvertiert.

Die Hauptfunktion (my_func) verwendet shared_array als Standardparameter, um unnötiges Kopieren zu vermeiden, und die Copy-on-Write-Semantik von Linux stellt die Datenduplizierung sicher Tritt nur auf, wenn Änderungen am gemeinsam genutzten Bereich vorgenommen werden.

Wenn Sie den Code ausführen, werden Sie feststellen, dass das freigegebene shared_array ohne Duplizierung gedruckt wird, was darauf hinweist, dass die Prozesse dasselbe Speicherobjekt gemeinsam genutzt haben.

Das obige ist der detaillierte Inhalt vonKann Multiprocessing schreibgeschützte freigegebene Daten ohne Replikation teilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn