Ich habe einen Python-Prozess, der 5 andere Python-Prozesse mit dem Multiprocessing-Modul hervorbringt. Lassen Sie uns den Elternprozess P0 und die anderen P1-P5 nennen. Wenn wir ein SIGTERM an P0 senden, muss es zuerst P1 bis P5 herunterfahren und sich dann selbst beenden.Wie wird ein Python-Prozess nach dem Empfang von SIGTERM beim Warten auf einen Semaphor ordnungsgemäß beendet?
Der Haken ist P1 und P5 warten auf Semaphoren. Wenn ich also SIGTERM an diese Prozesse sende, rufen sie den Signalhandler auf und beenden ihn. Aber da sie auf Semaphor warten, werfen sie eine Ausnahme. Gibt es eine Möglichkeit, diese Ausnahme vor dem Beenden zu fangen, so dass P0 bis P5 einen graziösen Ausgang ausführen können?
Traceback:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
Traceback (most recent call last):
Process Process-2:
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
Traceback (most recent call last):
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
Process Process-5:
Traceback (most recent call last):
File "/usr/lib64/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib64/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/opt/fireeye/scripts/mip/StaticAnalysisRunner.py", line 45, in run
qsem.acquire()
Welche Version von Python verwenden Sie? Welchen spezifischen Anruf machen P1 und P5 eigentlich, die sie auf einen Semaphor warten lassen? Können Sie die Tracebacks einbeziehen? – dano
Ein minimales Codebeispiel, das Ihr Problem reproduziert, wäre großartig. –
Ich benutze Python 2.7.8 P1 bis P5 versuchen, auf eine Warteschlange über Prozesse freigegeben zugreifen und den Zugriff auf die Warteschlange ist mit einem Semaphor geschützt.Etwas wie folgt: sem.acquire() item = q.get() sem.release() –