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ção

EDITAR: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:

Nota: as funções registradas através deste módulo não são chamadas quando o programa é interrompido por um sinal, quando um erro interno fatal do Python é detectado ou quando os._exit () é chamado.

questionAnswers(1)

yourAnswerToTheQuestion