Multiprocessing - Rohr vs-Warteschlange
Was sind die grundlegenden Unterschiede zwischen queues und pipes in Python-multiprocessing-Paket?
In welchen Szenarios sollte man wählen einen über den anderen? Wann ist es vorteilhaft Pipe()
? Wann ist es vorteilhaft Queue()
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
Rohr()
nur zwei Endpunkte.Einen
Queue()
können mehrere Erzeuger und Verbraucher.Wann Sie zu verwenden
Wenn Sie mehr als zwei Punkte zu kommunizieren, verwenden Sie eine
Queue()
.Wenn Sie brauchen, absolute Leistung, ein
Rohr()
ist viel schneller, daQueue()
baut aufPipe()
.Performance Benchmarking
Nehmen wir an, Sie wollen, um zu laichen zwei Prozesse und senden von Nachrichten zwischen Ihnen, so schnell wie möglich. Dies sind die timing-Ergebnisse einer drag-Rennen zwischen ähnlichen tests mit
Pipe()
undQueue()
... Dies ist auf eine ThinkpadT61 unter Ubuntu 11.10 und Python-2.7.2.FYI, warf ich in den Ergebnissen für
JoinableQueue()
als bonus;JoinableQueue()
Konten für Aufgaben, wennqueue.task_done()
genannt wird (es doesn ' T sogar wissen über die spezifische Aufgabe, es gilt nur unerledigte Aufgaben in der Warteschlange), so dassqueue.join()
weiß, die Arbeit ist fertig.Code für jeden am Ende dieser Antwort...
Zusammenfassend
Pipe()
ist etwa drei mal schneller als einQueue()
. Denken Sie gar nicht über dieJoinableQueue()
es sei denn, Sie wirklich haben müssen, die Vorteile.BONUS-MATERIAL 2
Multiprocessing eingeführt subtile Veränderungen in der Informationen fließen, die machen das Debuggen schwer, es sei denn, Sie wissen, einige Verknüpfungen. Zum Beispiel, haben Sie vielleicht ein Skript, das funktioniert gut, wenn die Indizierung durch ein Wörterbuch unter vielen Bedingungen, aber selten scheitert mit bestimmten Eingaben.
Normalerweise erhalten wir Hinweise auf die zu Versagen ist, wenn die gesamte python-Prozess stürzt ab, jedoch bekommen Sie keine unerwünschte crash-tracebacks auf der Konsole ausgegeben, wenn die multiprocessing-Funktion stürzt ab. Aufspüren von unbekannten Rendern abstürzt, ist es schwer, ohne eine Ahnung, was abgestürzten Prozess.
Die einfachste Möglichkeit, die ich gefunden habe, um track down multiprocessing crash informaiton ist, wickeln Sie die ganze multiprocessing-Funktion in einem
try
/except
und verwendentraceback.print_exc()
:Nun, wenn Sie finden, ein crash, Sie sehen etwas wie:
Source Code: