Si realmente desea capturar C-c específicamente, puede hacerlo de la manera habitual para una aplicación de Python: use signal.signal
para instalar un controlador para SIGINT
que haga lo que quiera hacer. Si invoca cualquier API retorcida desde el controlador, asegúrese de usar reactor.callFromThread
ya que casi todas las demás API retorcidas no son seguras para la invocación de manejadores de señal.
Sin embargo, si realmente está interesado en insertar algún código de limpieza de tiempo de apagado, entonces probablemente desee utilizar IService.stopService
(o el mecanismo en términos de los cuales se implementó, reactor.addSystemEventTrigger
).
Si está usando twistd
, entonces usar IService.stopService
es fácil. Ya tiene un objeto Application
con al menos un servicio adjunto. Puede agregar otro con un método personalizado stopService
que hace que su cierre funcione. El método puede devolver un Deferred
. Si lo hace, el proceso de apagado se pausa hasta que se dispare Deferred
. Esto le permite limpiar bien sus conexiones, incluso si eso implica más operaciones de red (o cualquier otra asincrónica).
Si no está usando twistd
, entonces usar reactor.addSystemEventTrigger
directamente es probablemente más fácil. Puede instalar un antes de apagar el disparador que se llamará en la misma circunstancia en que se haya llamado al IService.stopService
. Este disparador (cualquier objeto que se pueda llamar) también puede devolver un Deferred
para retrasar el apagado. Esto se hace con una llamada al reactor.addSystemEventTrigger('before', 'shutdown', callable)
(en algún momento antes de que se inicie el apagado, de modo que ya está registrado cada vez que se produce el apagado).
service.tac da un ejemplo de creación y uso de un servicio personalizado.
wxacceptance.py da un ejemplo del uso de addSystemEventTrigger
y retrasa el apagado por (un arbitrario) tres segundos.
Ambos de estos mecanismos le darán la notificación cada vez que se detenga el reactor. Esto puede deberse a una pulsación de tecla C-c, o puede ser porque alguien usó kill -INT ...
, o puede ser porque se llamó a algún lugar reactor.stop()
. Todos conducen al cierre del reactor, y el cierre del reactor siempre procesa los desencadenantes de eventos de cierre.
dulce, primer golpe en google "retorcido antes del cierre"! – Claudiu