Se vuoi davvero catturare C-c in modo specifico, puoi farlo nel solito modo per un'applicazione Python - usa signal.signal
per installare un gestore per SIGINT
che fa tutto ciò che vuoi fare. Se invochi eventuali API Twisted dal gestore, assicurati di utilizzare reactor.callFromThread
poiché quasi tutte le altre API Twisted non sono sicure per il richiamo dai gestori di segnale.
Tuttavia, se siete davvero solo interessato a inserire un po 'di pulizia del codice di arresto-tempo, allora probabilmente desidera utilizzare IService.stopService
(o il meccanismo in base al quale viene implementato, reactor.addSystemEventTrigger
) invece.
Se si utilizza twistd
, quindi utilizzare IService.stopService
è facile. Hai già un oggetto Application
con almeno un servizio collegato ad esso. Puoi aggiungerne un altro con un metodo personalizzato stopService
che fa funzionare il tuo arresto. Il metodo è autorizzato a restituire un valore Deferred
. In tal caso, il processo di spegnimento viene sospeso fino a quando viene generato il valore Deferred
. Ciò ti consente di ripulire le tue connessioni in modo corretto, anche se ciò comporta più operazioni di rete (o qualsiasi altra operazione asincrona).
Se non si utilizza twistd
, utilizzare direttamente reactor.addSystemEventTrigger
è probabilmente più semplice. Puoi installare un prima dell'arresto del trigger che verrà chiamato nella stessa circostanza che sarebbe stato chiamato IService.stopService
. Questo trigger (solo un qualsiasi oggetto callable) può anche restituire un Deferred
per ritardare lo spegnimento. Questo viene fatto con una chiamata a reactor.addSystemEventTrigger('before', 'shutdown', callable)
(qualche tempo prima che l'arresto venga avviato, in modo che sia già registrato ogni volta che si verifica l'arresto).
service.tac fornisce un esempio di creazione e utilizzo di un servizio personalizzato.
wxacceptance.py fornisce un esempio di utilizzo di addSystemEventTrigger
e il ritardo di spegnimento di (un arbitrario) tre secondi.
Entrambi questi meccanismi forniscono la notifica ogni volta che il reattore si sta arrestando. Ciò potrebbe essere dovuto a un tasto C-c, o potrebbe essere dovuto al fatto che qualcuno ha utilizzato kill -INT ...
, oppure potrebbe essere stato chiamato da qualche parte reactor.stop()
. Portano tutti allo spegnimento del reattore e lo spegnimento del reattore elabora sempre i trigger degli eventi di spegnimento.
fonte
2010-08-10 22:29:59
dolce, primo colpo su google "contorto prima dell'arresto"! – Claudiu