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.
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?
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>
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!