Aus dem Python-Terminal, ich einen Befehl wie den folgenden, führen Sie eine langlaufende Kind-Prozess zum Laichen:Python Multiprocessing und Unabhängigkeit von Kindern verarbeitet
from multiprocessing.process import Process
Process(target=LONG_RUNNING_FUNCTION).start()
Dieser Befehl gibt, und ich kann andere Dinge tun in Das Python-Terminal, aber alles, was vom Kind gedruckt wird, wird immer noch in meiner Python-Terminalsitzung gedruckt.
Wenn ich den Terminalausgang (entweder mit oder exit
CTRL + D ), dem Kommando exit es hängt. Wenn ich CTRL + C während dieses Hangs trete, wird der untergeordnete Prozess beendet.
Wenn ich den Python-Terminal-Prozess manuell (über den Posix-Befehl kill
) abbricht, ist der Kindprozess stattdessen verwaist und läuft weiter mit seiner vermutlich verworfenen Ausgabe.
Wenn ich diesen Code mit python -c
laufen, wartet er auf das Kind zu beenden, und CTRL +C tötet Eltern und Kind.
Welche Konfigurationen von Python führen zum Abbruch von Kindern, wenn die Eltern beendet werden? Insbesondere, wenn ein Python-mod_wsgi-apache-Webserver untergeordnete Prozesse hervorbringt und dann neu gestartet wird, werden die Kinder getötet?
[Was ist der richtige Weg, um Kindprozesse, die aus dem Terminal hervorgehen, abzutrennen? Gibt es eine Möglichkeit eleganter als die folgenden: Deliberately make an orphan process in python]
Update: Python Subprozesse gelaicht mit multiprocessing.Process
von einem Webserver unter Apache laufen ist nicht getötet, als Apache neu gestartet wird.
Subprozess ist mein Einstiegsmodul für das Dispatching von Systemaufrufen, aber die Verwendung von Subprozess zum Starten von Python-Hintergrundaufgaben erschien unangemessen. Hast du eine gute Python-Deamon-Bibliothek benutzt (zB Python-Deamon)? – Zags
Die Unterscheidung zwischen Hintergrund und Vordergrund ist spezifisch für die Jobsteuerung in einer Shell. Es macht keinen Sinn, diese Begriffe in der Anwendung für die Prozessverwaltung im Allgemeinen zu verwenden. Im allgemeineren Kontext ist die Daemonisierung etwas, das ein Prozess für sich selbst ausführt, und die Verwendung von "subprocess.Popen" zum Starten eines solchen Prozesses ist völlig Standard. 'Python-Daemon' ist in Ordnung; Es hat eine umständliche API, aber es ist kampferprobt, und die letztgenannte Qualität ist wichtig, da es einfach ist, solche Dinge falsch zu verstehen. – Alp