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

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top