Domanda

Ho una funzione che è responsabile per l'uccisione di un processo figlio quando il programma termina:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)

    def stop(self):
        os.kill(self.sel_server_pid, signal.SIGTERM)

Tuttavia ho un messaggio di errore quando questa funzione è denominata:

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'

Sembra che il os e signal i moduli di ottenere scaricato prima atexit viene chiamato.Re-importarli risolve il problema, ma questo comportamento mi sembra strano a me questi moduli sono importati prima di registrare il mio gestore, allora perché sono scaricato prima mia uscita gestore viene eseguito?

È stato utile?

Soluzione

Non ci sono garanzie circa l'ordine in cui le cose vengono distrutte al termine del programma il tempo, quindi è meglio per garantire atexitregistrati funzioni sono autonomi.E. g., nel tuo caso:

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)

Questo è preferibile re-importazione di moduli (che potrebbero causare un rallentamento del programma di cessazione e anche interminabile loop, ma che il rischio è minore per "fornito dal sistema" moduli come os).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top