Processo Python não chamará atexit
Estou tentando usaratexit
em umProcess
, mas infelizmente não parece funcionar. Aqui está um exemplo de código:
import time
import atexit
import logging
import multiprocessing
logging.basicConfig(level=logging.DEBUG)
class W(multiprocessing.Process):
def run(self):
logging.debug("%s Started" % self.name)
@atexit.register
def log_terminate():
# ever called?
logging.debug("%s Terminated!" % self.name)
while True:
time.sleep(10)
@atexit.register
def log_exit():
logging.debug("Main process terminated")
logging.debug("Main process started")
a = W()
b = W()
a.start()
b.start()
time.sleep(1)
a.terminate()
b.terminate()
A saída deste código é:
DEBUG:root:Main process started DEBUG:root:W-1 Started DEBUG:root:W-2 Started DEBUG:root:Main process terminated
Eu esperaria que oW.run.log_terminate()
seria chamado quandoa.terminate()
eb.terminate()
são chamados e a saída deve ser algo como (ênfase adicionada):
DEBUG:root:Main process started DEBUG:root:W-1 Started DEBUG:root:W-2 Started DEBUG:root:W-1 Terminated! DEBUG:root:W-2 Terminated! DEBUG:root:Main process terminated
Por que isso não está funcionando e há uma maneira melhor de registrar uma mensagem (doProcess
contexto) quando umProcess
Está terminado?
Obrigado pela sua contribuição - é muito apreciado.
SoluçãoEDITAR:Com base na solução sugerida por Alex Martelli, o seguinte funciona conforme o esperado:
import sys
import time
import atexit
import signal
import logging
import multiprocessing
logging.basicConfig(level=logging.DEBUG)
class W(multiprocessing.Process):
def run(self):
logging.debug("%s Started" % self.name)
def log_terminate(num, frame):
logging.debug("%s Terminated" % self.name)
sys.exit()
signal.signal(signal.SIGTERM, log_terminate)
while True:
time.sleep(10)
@atexit.register
def log_exit():
logging.debug("Main process terminated")
logging.debug("Main process started")
a = W()
b = W()
a.start()
b.start()
time.sleep(1)
a.terminate()
b.terminate()
Vale a pena observar o seguinte comentário no<a href="http://docs.python.org/library/atexit.html" rel="noreferrer">atexit</a>
documentação: