Referenzierung andere Module in atexit
Frage
Ich habe eine Funktion, die für das Töten eines Kindes Prozess, wenn das Programm beendet ist verantwortlich:
class MySingleton:
def __init__(self):
import atexit
atexit.register(self.stop)
def stop(self):
os.kill(self.sel_server_pid, signal.SIGTERM)
Jedoch habe ich eine Fehlermeldung erhalten, wenn diese Funktion aufgerufen wird:
Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'
Sieht aus wie der os
und signal
Module entladen erhalten, bevor atexit
genannt wird. Re-Import von ihnen das Problem löst, aber dieses Verhalten scheint mir seltsam - diese Module importiert werden, bevor ich meine Handler registrieren, also warum sie entladen werden, bevor meine eigenen Ausgang Handler läuft
Lösung
Es gibt keine starken Garantien über die Reihenfolge, in der die Dinge bei Programmende Zeit zerstört werden, so ist es am besten atexit
-registrierten Funktionen, um sicherzustellen, sind in sich abgeschlossen. Zum Beispiel in Ihrem Fall:
class MySingleton:
def __init__(self):
import atexit
atexit.register(self.stop)
self._dokill = os.kill
self._thesig = signal.SIGTERM
def stop(self):
self._dokill(self.sel_server_pid, self._thesig)
Dies ist bevorzugt, um den erneuten Import-Module (das könnte möglicherweise Ursache Verlangsamung des Programmabbruch und sogar Schleifen unending, obwohl das Risiko für „System bereitgestellte“ Module weniger ist wie os
).