multiprocessing.Queue und Queue.Queue sind unterschiedlich?

7

Wenn ich Queue.Queue verwende, funktioniert meine Funktion read() nicht, warum? Aber wenn ich multiprocessing.Queue verwende, funktioniert es gut:

%Vor%     
Muge 18.05.2015, 03:15
quelle

1 Antwort

20

Queue.Queue ist nur eine speicherinterne Warteschlange, die weiß, wie sie mit mehreren Threads umgehen soll, die sie gleichzeitig verwenden. Es funktioniert nur, wenn sowohl der Produzent als auch der Verbraucher in demselben Prozess sind.

Sobald Sie sie in getrennten Systemprozessen haben, worum es in der multiprocessing -Bibliothek geht, sind die Dinge ein wenig komplizierter, weil die Prozesse nicht mehr den gleichen Speicher teilen. Sie benötigen eine Art Interprozess-Kommunikationsmethode, damit die beiden Prozesse miteinander kommunizieren können. Es kann ein gemeinsamer Speicher sein, eine Pipe oder ein Socket oder möglicherweise etwas anderes. Das macht multiprocessing.Queue . Es verwendet Pipes, um zwei Prozessen die Kommunikation zu ermöglichen. Es wird einfach die gleiche API wie Queue.Queue implementiert, da die meisten Python-Programmierer bereits damit vertraut sind.

Beachten Sie auch, dass Sie bei der Verwendung der Warteschlange eine Wettlaufsituation in Ihrem Programm haben. Denken Sie darüber nach, was passiert, wenn der Prozess write in die Warteschlange schreibt, nachdem Sie q.empty() im Prozess read aufgerufen haben. Normalerweise würden Sie der Warteschlange ein spezielles Element hinzufügen (z. B. None ), was bedeuten würde, dass der Benutzer anhalten kann.

    
Lukáš Lalinský 18.05.2015, 03:26
quelle

Tags und Links