2016-07-23 5 views
0

Ich benutze Python 2.7. Ich habe ein Multithread-Programm, wo die Threads Befehle mit dem Modul subprocess starten. Die Prozesse werden auf dem System ausgeführt und melden gelegentlich Daten an die Threads. Der Großteil der Arbeit wird in den Prozessen erledigt - die Threads nehmen nur Informationen aus den Prozessen und schreiben sie zum Beispiel in eine Datei.Effizienz der Verwendung von Subprozess in Verbindung mit Threads, in Python

Ich verstehe, dass es Einschränkungen bei der Verwendung von Multithreading mit Python gibt. Aber in diesem Fall erwarte ich, dass das ganze Heavy Lifting vom System (Linux) ausgeführt wird, weil die gestarteten Subprozesse CPU-intensive Sachen machen. Die Fäden müssen also keine Last tragen und sollten daher kein Flaschenhals sein.

Ist mein Verständnis der Verwendung von Threads und Teilprozesse in Python genau? Ich denke, ein grundlegender Teil meines Verständnisses ist, dass diese verschiedenen Teilprozesse auf verschiedenen Kernen laufen können. Selbst wenn die Threads an einen Kern gebunden sind, werden die Prozesse effizient ausgeführt, und die Threads können Informationen von ihnen sammeln, sobald sie verfügbar sind.

+0

Ja, Sie haben Recht. Pythons GIL lässt nur einen Thread gleichzeitig laufen, aber diese Regel gilt nur für den Python-Prozess - alle Subprozesse laufen unabhängig voneinander. Da die Python-Threads meistens nur auf Daten von den Subprozessen warten, stören sie sich nicht gegenseitig. – tdelaney

Antwort

0

Warum haben die Subprozesse nicht nur die Datenverarbeitung selbst übernommen? Das Zurückgeben von Daten an den Prozess erfordert extra context switches und den Overhead von Serialisierung und Deserialisierung, was signifikant werden kann, wenn Sie viel Arbeit haben, um zum Hauptprozess zurückzukehren. Es könnte einfacher sein, Threads in den Subprozessen zu verwenden, als diese Strafe zu bezahlen.

Es gibt jedoch etwas Wichtiges zu beachten. Obwohl I/O-gebundener Code (Datei schreibt, Daten auf einem Socket senden und empfangen usw.) keine Engpässe mit der Global Interpreter-Sperre verursacht, werden CPU-gebundene Tasks. Weitere Informationen zu Threading-Problemen finden Sie unter Jesse Noller's blog post on threads und the Python Wiki's article on the GIL.

+0

Es gibt viele Gründe, warum die Unterprozesse eine schlechte Wahl für die Verarbeitung von Daten aus ihren eigenen Stdout/Stderr-Pipes sein können. Vielleicht protokolliert das Hauptprogramm und möchte, dass die Informationen in einer einzigen Datei verschachtelt werden oder aggregierte Daten für eigene Verarbeitungsanforderungen übernehmen. Angenommen, es handelt sich um Prozesse von Drittanbietern, die nicht geändert werden können. Das Pipelining von Daten durch mehrere Prozesse ist eine altehrwürdige Linux/Unix-Tradition. – tdelaney

+0

@tdelaney Er sagte, dass er 'subprocess' in seiner eigenen Anwendung verwendet, daher nehme ich an, dass er die volle Kontrolle hat. Ja, das Übergeben von Daten über Pipelines ist eine altehrwürdige Unix-Tradition, aber es ist nicht immer die effizienteste Art, eine Verarbeitung durchzuführen. – Elizafox