"Werden untergeordnete Prozesse über Multiprozessor-Freigabeobjekte erzeugt, die zuvor im Programm erstellt wurden?"
Nein (Python vor 3.8) und Ja in 3.8 ( https://docs.python.org/3/library/multiprocessing.shared_memory.html#module-multiprocessing.shared_memory )
Prozesse haben einen unabhängigen Speicherplatz.
Lösung 1
Tun Sie dies, um eine große Struktur mit vielen Arbeitern optimal zu nutzen.
Schreiben Sie jeden Worker als "Filter" - liest Zwischenergebnisse von stdin, funktioniert, schreibt Zwischenergebnisse auf stdout.
Verbinden Sie alle Mitarbeiter als Pipeline:
process1 <source | process2 | process3 | ... | processn >result
Jeder Prozess liest, arbeitet und schreibt.
Dies ist bemerkenswert effizient, da alle Prozesse gleichzeitig ausgeführt werden. Die Schreib- und Lesevorgänge durchlaufen direkt gemeinsam genutzte Puffer zwischen den Prozessen.
Lösung 2
In einigen Fällen haben Sie eine komplexere Struktur - häufig eine "Fan-Out" -Struktur. In diesem Fall haben Sie einen Elternteil mit mehreren Kindern.
Übergeordnetes Element öffnet Quelldaten. Eltern gabeln eine Reihe von Kindern.
Das übergeordnete Element liest die Quelle und gibt Teile der Quelle an jedes gleichzeitig ausgeführte untergeordnete Element weiter.
Wenn der Elternteil das Ende erreicht hat, schließen Sie das Rohr. Das Kind bekommt das Dateiende und endet normal.
Die Kinderteile sind angenehm zu schreiben, weil jedes Kind einfach liest sys.stdin
.
Die Eltern haben ein wenig ausgefallene Beinarbeit, um alle Kinder zu laichen und die Pfeifen richtig zu halten, aber es ist nicht so schlimm.
Fan-In ist die entgegengesetzte Struktur. Eine Reihe von unabhängig laufenden Prozessen muss ihre Eingaben zu einem gemeinsamen Prozess verschachteln. Der Sammler ist nicht so einfach zu schreiben, da er aus vielen Quellen lesen muss.
Das Lesen von vielen benannten Pipes erfolgt häufig mithilfe des select
Moduls, um festzustellen, welche Pipes ausstehende Eingaben haben.
Lösung 3
Shared Lookup ist die Definition einer Datenbank.
Lösung 3A - Laden Sie eine Datenbank. Lassen Sie die Mitarbeiter die Daten in der Datenbank verarbeiten.
Lösung 3B - Erstellen Sie einen sehr einfachen Server mit werkzeug (oder ähnlichem), um WSGI-Anwendungen bereitzustellen, die auf HTTP GET reagieren, damit die Mitarbeiter den Server abfragen können.
Lösung 4
Freigegebenes Dateisystemobjekt. Unix OS bietet Shared Memory-Objekte. Dies sind nur Dateien, die dem Speicher zugeordnet sind, sodass das Austauschen von E / A anstelle von mehr konventionell gepufferten Lesevorgängen erfolgt.
Sie können dies aus einem Python-Kontext auf verschiedene Arten tun
Schreiben Sie ein Startprogramm, das (1) Ihr ursprüngliches gigantisches Objekt in kleinere Objekte zerlegt und (2) Arbeiter mit jeweils einem kleineren Objekt startet. Die kleineren Objekte könnten eingelegte Python-Objekte sein, um ein wenig Zeit beim Lesen von Dateien zu sparen.
Schreiben Sie ein Startprogramm, das (1) Ihr ursprüngliches gigantisches Objekt liest und mithilfe von seek
Operationen eine seitenstrukturierte, bytecodierte Datei schreibt, um sicherzustellen, dass einzelne Abschnitte mit einfachen Suchvorgängen leicht zu finden sind. Dies ist, was ein Datenbankmodul tut - die Daten in Seiten aufteilen, jede Seite über a leicht zu finden machen seek
.
Spawn-Mitarbeiter mit Zugriff auf diese große Datei mit Seitenstruktur. Jeder Arbeiter kann nach den relevanten Teilen suchen und dort seine Arbeit erledigen.
marshal.load
Eltern und jedes Kind auf (jeder Prozess importiert das Modul).