multiprocessing.Pipe ist sogar langsamer als Multiprocessing.Queue?

8

Ich habe versucht, die Geschwindigkeit von Pipe über Queue vom Paket multiprocessing zu vergleichen. T dachte Pipe wäre schneller als Queue verwendet Pipe intern.

Seltsamerweise ist Pipe langsamer als Queue beim Senden eines großen numpy Arrays. Was fehlt mir hier?

Rohr:

%Vor%

Warteschlange

%Vor%     
zaxliu 20.01.2018, 07:09
quelle

2 Antworten

7

Sie können ein Experiment machen und das Folgende in Ihren Pipe Code einfügen.

%Vor%

Dies gibt Ihnen die Zeit, die zum Erstellen der Daten für Ihren Test benötigt wird. Auf meinem System dauert das ungefähr 2,9 Sekunden.

Unter der Haube implementiert das Objekt queue einen Puffer und einen Thread-Versand. Der Thread befindet sich noch immer im selben Prozess, aber bei der Verwendung muss die Datenerstellung nicht auf den Abschluss der System-IO warten. Es paralisiert effektiv die Operationen. Versuchen Sie, Ihren Pipe -Code zu modifizieren, indem Sie ein einfaches Threading implementieren (Disclaimer, Code hier ist nur für Test und nicht produktionsbereit).

%Vor%

Auf meinem Rechner dauert dies 3,4 Sekunden, was fast genau so ist wie Ihr Queue oben.

Von Ссылка

In Cython kann aufgrund der Global Interpreter-Sperre nur ein Thread Python-Code auf einmal ausführen. Allerdings ist Threading immer noch ein geeignetes Modell, wenn Sie mehrere I / O-gebundene Aufgaben ausführen möchten gleichzeitig.

Die queue und pipe Unterschiede sind definitiv ein seltsames Implementierungsdetail, bis Sie sich ein wenig damit beschäftigen.

    
bivouac0 23.01.2018, 04:48
quelle
4

Ich nehme an, dass Sie mit Ihrem Druckbefehl Python2 verwenden. Das seltsame Verhalten kann jedoch nicht mit Python3 repliziert werden, wobei Pipe tatsächlich schneller ist als Queue .

%Vor%

Ergebnisse in:

%Vor%     
Fabio Veronese 28.01.2018 22:46
quelle

Tags und Links