2016-04-15 14 views
0

Ich habe eine einfache Funktion geschrieben, um Jobs mit Abhängigkeiten zu verfolgen. Der genaue Code ist nicht wichtig, aber die Art, wie ich es gemacht habe, ist eine Jobüberwachungsfunktion, die ich verzweige mit multiprocessing.Process, ich sende und bekomme Jobs zu/von ihm mit zwei multiprocessing Queue Objekte.Python Multiprocessing: Kill Worker bei Beenden

Es funktioniert gut, aber weil ich eine Endlosschleife verwenden, wenn der Elternprozess beim Beenden hängt, weil Python immer noch auf das Kind wartet. Gibt es eine gute Möglichkeit, einen Kindprozess sofort beim Beenden zu beenden? Vielleicht durch ein Signal?

Mein eigentlicher Code ist hier: https://gist.github.com/MikeDacre/e672969aff980ee950b9dfa8b2552d40 Ein vollständigeres Beispiel ist hier: http://nbviewer.jupyter.org/github/MikeDacre/python-cluster/blob/cluster/tests/local_queue.ipynb

Ein Spielzeug Beispiel wahrscheinlich besser ist, aber:

import multiprocessing as mp 
from time import sleep 
def runner(): 
    while True: 
     sleep(2) 

runner = mp.Process(target=runner) 
runner.start() 
exit() 

Das glücklich hängt bis Ctrl-C trat ein.

Ich glaube nicht, Signalfang funktioniert, da keine Signale am normalen Ausgang gesendet werden. Gibt es eine Möglichkeit, exit() zu fangen? Wenn nicht, gibt es eine Möglichkeit, einen Prozess so zu erstellen, dass er auf natürliche Weise beendet wird?

+2

Sie könnten nach der Eltern-PID in EnumProcesses suchen anstatt nach "while True". –

+0

@ g.d.d.c Ich weiß nicht, wie man EnumProcesses verwendet, ist das ein Teil des Multiprocessing? –

Antwort

0

Vielen Dank allen, kurz nachdem diese Frage zu schreiben, dachte ich, die Lösung atexit Modul Python aus:

import atexit 
import multiprocessing as mp 
from time import sleep 
def runner(): 
    while True: 
     sleep(2) 

def kill_runner(runner): 
    runner.terminate() 

runner = mp.Process(target=runner) 
runner.start() 
atexit.register(kill_runner, runner) 
exit() 

Das wie erwartet funktioniert.

Verwandte Themen