Was ist der beste Weg, mehrere Unterprozesse über fork () auszuführen?

8

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.

    
victorz 06.10.2008, 15:47
quelle

4 Antworten

10

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 06.10.2008, 16:26
quelle
4

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%     
Federico A. Ramponi 07.10.2008 04:31
quelle
2

Haben Sie sich das Modul pyprocessing angesehen?

    
Bryan Oakley 06.10.2008 16:16
quelle
1

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.

    
Dan Lenski 06.10.2008 16:17
quelle

Tags und Links