Riferimento ad altri moduli in atexit
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?
Soluzione
Non ci sono garanzie circa l'ordine in cui le cose vengono distrutte al termine del programma il tempo, quindi è meglio per garantire atexit
registrati 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
).