Multiprocessing: Wie funktionieren Sharedctypes (RawArray, RawValue) intern, wie vergleichen sie sich mit SharedMemory uPython

Python-Programme
Anonymous
 Multiprocessing: Wie funktionieren Sharedctypes (RawArray, RawValue) intern, wie vergleichen sie sich mit SharedMemory u

Post by Anonymous »

Ich habe mich über Parallelität und gemeinsam genutzten Speicher im SysV- und POSIX-Stil im Allgemeinen und über das Multiprocessing-Paket von Python im Besonderen informiert. Jetzt habe ich ein paar Fragen, bei denen mich mein Google-Fu bisher nicht weitergebracht hat:
Q1 Soweit ich dieses Problem im Python-Bugtracker verstehe, verwendet das kürzlich eingeführte multiprocessing.shared_memory.SharedMemory den POSIX-Namen Shared Memory. Wenn es um Typen wie RawArray und RawValue geht, die in multiprocessing.sharedctypes definiert sind, lassen die Python-Dokumente jedoch viel zu wünschen übrig. Wie werden sie intern implementiert?
F2 Ist der einzige praktische Unterschied beispielsweise zwischen einem RawArray('B') und einer Instanz von multiprocessing.shared_memory.SharedMemory, dass letztere einen Namen hat und auch von nicht verwandten (möglicherweise nicht Python) Prozessen aus zugänglich ist? Ist ihre Leistung vergleichbar?
F3 Wie genau werden Multiprocessing-Sperren in Python implementiert? Müssen sie nicht auch eine Art gemeinsames Gedächtnis verwenden? In den Dokumenten heißt es:

Hinweis
Einige Funktionen dieses Pakets erfordern eine funktionierende Shared-
Semaphor-Implementierung auf dem Host-Betriebssystem. Ohne eines wird
das Modul multiprocessing.synchronize deaktiviert und Versuche
, es zu importieren, führen zu einem ImportError. Weitere Informationen finden Sie unter bpo-3770.

(Beachten Sie, dass multiprocessing.Lock tatsächlich von multiprocessing.synchronize.Lock stammt.) Gemäß der verknüpften Ausgabe bpo-3770 verwendet Lock nun shm_open() von libc, das ein benanntes Semaphor erstellt. Funktioniert das ähnlich wie SharedMemory?
Aktualisierung: Laut Quellcode – insbesondere diese Zeilen: Link 1, Link 2 (Danke, Bnaecker!) – werden RawArray und RawValue auf Nicht-Windows-Systemen einfach mithilfe einer temporären Datei implementiert, die (zumindest unter Linux) in einem Verzeichnis abgelegt wird, das nicht durch Speicher gesichert ist, nämlich /dev/shm. Dies scheint dann der Funktionsweise von POSIX Shared Storage, d. h. SharedMemory, sehr ähnlich zu sein. Daher sollte ich meine Frage Q1 wohl durch die folgende ersetzen: Warum wurde shared_memory überhaupt eingeführt, wenn RawArray so ähnlich ist? Das oben erwähnte Problem erwähnt von Anfang an Leistungsgründe, aber ich verstehe nicht, woher dieser Leistungsunterschied (zumindest unter Linux) kommen soll?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post