Ein Python-Skript muss mehrere Unterprozesse über fork () erzeugen. Alle diese untergeordneten Prozesse sollten gleichzeitig ausgeführt werden und der übergeordnete Prozess sollte warten, bis alle Prozesse abgeschlossen sind. Eine Möglichkeit zu haben, ein Timeout für ein "langsames" Kind zu setzen, wäre schön. Der Elternprozess verarbeitet den Rest des Skripts weiter, nachdem alle Kinder gesammelt wurden.
Was ist der beste Weg, um es auszuarbeiten? Vielen Dank.
Einfaches Beispiel:
%Vor% Das Ausstrecken eines langsamen Kindes ist ein wenig mehr Arbeit; Sie können wait
anstelle von waitpid
verwenden und die zurückgegebenen Werte aus der Liste der untergeordneten Elemente ausschließen, anstatt nacheinander auf diese zu warten (wie hier). Wenn Sie einen alarm
mit einem SIGALRM
-Handler einrichten, können Sie das Warten nach einer angegebenen Verzögerung beenden. Dies ist alles Standard-UNIX-Zeug, nicht Python-spezifisch ...
Ephemient : Jedes Kind in Ihrem Code bleibt nach Beendigung seines Jobs in der for-Schleife. Er wird immer wieder forschen. Außerdem werden die Kinder, die beginnen, wenn Kinder [] nicht leer sind, versuchen, auf einige ihrer Brüder am Ende der Schleife zu warten. Irgendwann wird jemand zusammenbrechen. Dies ist eine Umgehungslösung:
%Vor% Die traditionelle UNIX-Methode zur Kommunikation mit Unterprozessen besteht darin, Pipes zu ihrer Standardeingabe / -ausgabe zu öffnen und den Systemprozess select()
zum Multiplexen der Kommunikation im übergeordneten Prozess zu verwenden (verfügbar in Python über .. . Das select
-Modul).
Wenn Sie einen langsam laufenden untergeordneten Prozess beenden müssen, können Sie einfach seine Prozess-ID speichern (zurückgegeben durch den os.fork()
-Aufruf) und dann os.kill()
verwenden, um sie zu beenden, wenn sie nicht mehr benötigt wird. Natürlich wäre es wahrscheinlich sauberer, in der Lage zu sein, explizit mit dem Kindprozess zu kommunizieren und es zu sagen , sich selbst abzuschalten.