Wenn Sie wirklich, wirklich C-c spezifisch fangen möchten, dann können Sie dies in der üblichen Weise für eine Python-Anwendung tun - verwenden Sie signal.signal
, um einen Handler für SIGINT
zu installieren, der tut, was Sie tun möchten. Wenn Sie Twisted-APIs vom Handler aufrufen, stellen Sie sicher, dass Sie reactor.callFromThread
verwenden, da fast alle anderen Twisted-APIs für den Aufruf von Signalhandlern unsicher sind.
Wenn Sie jedoch nur daran interessiert sind, einen Cleanup-Code für die Abschaltzeit hinzuzufügen, möchten Sie wahrscheinlich stattdessen IService.stopService
(oder den Mechanismus, in dem es implementiert ist, reactor.addSystemEventTrigger
) verwenden. Wenn Sie twistd
verwenden, ist die Verwendung von IService.stopService
einfach. Sie haben bereits ein Application
Objekt mit mindestens einem Service. Sie können einen weiteren mit einer benutzerdefinierten stopService
Methode hinzufügen, die Ihre Shutdown-Arbeit erledigt. Die Methode darf Deferred
zurückgeben. Wenn dies der Fall ist, wird der Abschaltvorgang angehalten, bis Deferred
ausgelöst wird. Auf diese Weise können Sie Ihre Verbindungen sauber bereinigen, auch wenn dies einige Netzwerkoperationen (oder andere asynchrone Vorgänge) erfordert. Wenn Sie twistd
nicht verwenden, ist die Verwendung von reactor.addSystemEventTrigger
direkt wahrscheinlich einfacher. Sie können einen vor dem Shutdown Trigger installieren, der unter den gleichen Umständen IService.stopService
aufgerufen würde aufgerufen werden würde. Dieser Trigger (nur ein beliebiges aufrufbares Objekt) kann auch eine Deferred
zurückgeben, um das Herunterfahren zu verzögern. Dies geschieht mit einem Aufruf an reactor.addSystemEventTrigger('before', 'shutdown', callable)
(irgendwann bevor das Herunterfahren initiiert wird, so dass es bereits registriert ist, wenn ein Herunterfahren stattfindet).
service.tac gibt ein Beispiel zum Erstellen und Verwenden eines benutzerdefinierten Dienstes.
wxacceptance.py gibt ein Beispiel für die Verwendung von addSystemEventTrigger
und verzögern Herunterfahren um (eine beliebige) drei Sekunden.
Diese beiden Mechanismen geben Ihnen die Meldung immer wenn der Reaktor stoppt. Dies kann auf einen C-c-Tastenanschlag zurückzuführen sein, oder es kann sein, dass jemand kill -INT ...
verwendet, oder es könnte sein, weil irgendwo reactor.stop()
aufgerufen wurde. Sie führen alle zur Abschaltung des Reaktors, und die Abschaltung des Reaktors verarbeitet immer Abschaltungsereignisse.
süß, erster Schlag auf googling "verdreht vor dem Herunterfahren"! – Claudiu