Ich habe dieses Problem jetzt seit einer Woche angepackt und es ist ziemlich frustrierend geworden, denn jedes Mal, wenn ich ein einfacheres, aber ähnlich großes Beispiel für das, was ich machen muss, umsetze, stellt sich heraus, dass Multiprozessing es verpuffen wird. Die Art und Weise, wie es mit Shared Memory umgeht, verblüfft mich, weil es so begrenzt ist, dass es ziemlich schnell nutzlos werden kann.
Also ist die grundlegende Beschreibung meines Problems, dass ich einen Prozess erstellen muss, der in einigen Parametern übergeben wird, um ein Bild zu öffnen und ungefähr 20K Patches der Größe 60x40 zu erstellen. Diese Patches werden jeweils in einer Liste 2 gespeichert und müssen an den Hauptthread zurückgegeben werden, um dann von zwei anderen gleichzeitigen Prozessen, die auf der GPU ausgeführt werden, erneut verarbeitet zu werden.
Der Prozess und der Workflow und all das, was meistens erledigt wird, was ich jetzt brauche ist, dass der Teil, der am einfachsten sein sollte, sich als der schwierigste herausstellt. Ich konnte nicht speichern und bekomme die Liste mit 20K Patches zurück zum Hauptthread.
Das erste Problem war, weil ich diese Patches als PIL-Bilder gespeichert habe. Ich habe dann herausgefunden, dass alle Daten, die zu einem Queue-Objekt hinzugefügt werden, gebeizt werden müssen. Das zweite Problem war, dass ich die Patches dann in ein Array von je 60x40 konvertiert und in einer Liste gespeichert habe. Und das geht jetzt immer noch nicht? Anscheinend haben Warteschlangen eine begrenzte Menge an Daten, die sie sonst speichern können, wenn Sie queue_obj.get () aufrufen, hängt das Programm.
Ich habe viele andere Dinge ausprobiert, und jede neue Sache, die ich versuche, funktioniert nicht, also würde ich gerne wissen, ob jemand andere Empfehlungen einer Bibliothek hat, die ich verwenden kann, um Objekte ohne all den Fuzz zu teilen?
Hier ist eine Beispielimplementierung der Art von was ich betrachte. Denken Sie daran, das funktioniert vollkommen in Ordnung, aber die vollständige Implementierung nicht. Und ich habe den Code, um Informationsnachrichten zu drucken, um zu sehen, dass die gespeicherten Daten die exakt gleiche Form und alles haben, aber aus irgendeinem Grund funktioniert es nicht. In der vollständigen Implementierung wird der unabhängige Prozess erfolgreich abgeschlossen, jedoch bei q.get () eingefroren.
%Vor% Warteschlange dient zur Kommunikation zwischen Prozessen. In Ihrem Fall haben Sie nicht wirklich diese Art von Kommunikation. Sie können den Prozess einfach zurückgeben lassen und die Methode .get()
verwenden, um sie zu sammeln. (Denken Sie daran, if __name__ == "main":
hinzuzufügen, siehe Programmierrichtlinie )
Nun, nach der ersten Antwort dieses Beitrags , Multiprozessing nur passierbare Objekte übergeben. Das Beizen ist im Multiprocessing wahrscheinlich unvermeidlich, da Prozesse keinen Speicher teilen. Sie leben einfach nicht im selben Universum. (Sie erben Speicher, wenn sie zum ersten Mal erzeugt werden, aber sie können ihr eigenes Universum nicht erreichen). Das PIL-Bildobjekt selbst ist nicht pickbar. Sie können es einfügbar machen, indem Sie nur die darin gespeicherten Bilddaten extrahieren, wie in diesem Beitrag vorgeschlagen.
Da Ihr Problem hauptsächlich I / O-gebunden ist, können Sie auch Multi-Threading versuchen. Es könnte für Ihren Zweck noch schneller sein. Threads teilen alles, so dass kein Beizen erforderlich ist. Wenn Sie Python 3 verwenden, ist ThreadPoolExecutor
ein wunderbares Werkzeug. Für Python 2 können Sie ThreadPool verwenden. Um eine höhere Effizienz zu erreichen, müssen Sie die Vorgehensweise neu anordnen, den Prozess aufteilen und verschiedene Threads ausführen lassen.
Ich habe dieses Problem jetzt seit einer Woche angepackt und es ist ziemlich frustrierend geworden, denn jedes Mal, wenn ich ein einfacheres, aber ähnlich großes Beispiel für das, was ich machen muss, umsetze, stellt sich heraus, dass Multiprozessing es verpuffen wird. Die Art und Weise, wie es mit Shared Memory umgeht, verblüfft mich, weil es so begrenzt ist, dass es ziemlich schnell nutzlos werden kann.
Also ist die grundlegende Beschreibung meines Problems, dass ich einen Prozess erstellen muss, der in einigen Parametern übergeben wird, um ein Bild zu öffnen und ungefähr 20K Patches der Größe 60x40 zu erstellen. Diese Patches werden jeweils in einer Liste 2 gespeichert und müssen an den Hauptthread zurückgegeben werden, um dann von zwei anderen gleichzeitigen Prozessen, die auf der GPU ausgeführt werden, erneut verarbeitet zu werden.
Der Prozess und der Workflow und all das, was meistens erledigt wird, was ich jetzt brauche ist, dass der Teil, der am einfachsten sein sollte, sich als der schwierigste herausstellt. Ich konnte nicht speichern und bekomme die Liste mit 20K Patches zurück zum Hauptthread.
Das erste Problem war, weil ich diese Patches als PIL-Bilder gespeichert habe. Ich habe dann herausgefunden, dass alle Daten, die zu einem Queue-Objekt hinzugefügt werden, gebeizt werden müssen. Das zweite Problem war, dass ich die Patches dann in ein Array von je 60x40 konvertiert und in einer Liste gespeichert habe. Und das geht jetzt immer noch nicht? Anscheinend haben Warteschlangen eine begrenzte Menge an Daten, die sie sonst speichern können, wenn Sie queue_obj.get () aufrufen, hängt das Programm.
Ich habe viele andere Dinge ausprobiert, und jede neue Sache, die ich versuche, funktioniert nicht, also würde ich gerne wissen, ob jemand andere Empfehlungen einer Bibliothek hat, die ich verwenden kann, um Objekte ohne all den Fuzz zu teilen?
Hier ist eine Beispielimplementierung der Art von was ich betrachte. Denken Sie daran, das funktioniert vollkommen in Ordnung, aber die vollständige Implementierung nicht. Und ich habe den Code, um Informationsnachrichten zu drucken, um zu sehen, dass die gespeicherten Daten die exakt gleiche Form und alles haben, aber aus irgendeinem Grund funktioniert es nicht. In der vollständigen Implementierung wird der unabhängige Prozess erfolgreich abgeschlossen, jedoch bei q.get () eingefroren.
%Vor% Warteschlange dient zur Kommunikation zwischen Prozessen. In Ihrem Fall haben Sie nicht wirklich diese Art von Kommunikation. Sie können den Prozess einfach zurückgeben lassen und die Methode Queue
verwenden, um sie zu sammeln. (Denken Sie daran, qn1.cancel_join_thread()
hinzuzufügen, siehe Programmierrichtlinie )
Nun, nach der ersten Antwort dieses Beitrags , Multiprozessing nur passierbare Objekte übergeben. Das Beizen ist im Multiprocessing wahrscheinlich unvermeidlich, da Prozesse keinen Speicher teilen. Sie leben einfach nicht im selben Universum. (Sie erben Speicher, wenn sie zum ersten Mal erzeugt werden, aber sie können ihr eigenes Universum nicht erreichen). Das PIL-Bildobjekt selbst ist nicht pickbar. Sie können es einfügbar machen, indem Sie nur die darin gespeicherten Bilddaten extrahieren, wie in diesem Beitrag vorgeschlagen.
Da Ihr Problem hauptsächlich I / O-gebunden ist, können Sie auch Multi-Threading versuchen. Es könnte für Ihren Zweck noch schneller sein. Threads teilen alles, so dass kein Beizen erforderlich ist. Wenn Sie Python 3 verwenden, ist put
ein wunderbares Werkzeug. Für Python 2 können Sie ThreadPool verwenden. Um eine höhere Effizienz zu erreichen, müssen Sie die Vorgehensweise neu anordnen, den Prozess aufteilen und verschiedene Threads ausführen lassen.
Tags und Links python multithreading shared-memory multiprocessing python-multiprocessing