本当に、本当に Cc を具体的にキャッチしたい場合は、Python アプリケーションの通常の方法でこれを行うことができます - を使用して、やりたいことをsignal.signal
実行するためのハンドラーをインストールします。SIGINT
ハンドラーから Twisted API を呼び出す場合は、reactor.callFromThread
他のほとんどすべての Twisted API がシグナル ハンドラーからの呼び出しに対して安全でないため、必ず使用してください。
ただし、シャットダウン時のクリーンアップ コードを挿入することに本当に関心がIService.stopService
ある場合は、代わりに (またはそれが実装されているメカニズム)を使用することをお勧めしますreactor.addSystemEventTrigger
。
を使用している場合twistd
、使用IService.stopService
は簡単です。Application
少なくとも 1 つのサービスが関連付けられたオブジェクトが既に存在します。stopService
シャットダウン作業を行うカスタム メソッドを使用して、別のものを追加できます。メソッドは を返すことができDeferred
ます。そうである場合、シャットダウン プロセスはそれが起動するまで一時停止されDeferred
ます。これにより、ネットワーク (またはその他の非同期) 操作がさらに必要な場合でも、接続を適切にクリーンアップできます。
を使用していない場合は、直接twistd
使用する方がおそらく簡単です。呼び出されるのと同じ状況で呼び出されるシャットダウン前reactor.addSystemEventTrigger
トリガーをインストールできます。このトリガー (任意の呼び出し可能なオブジェクト) は、シャットダウンを遅らせるためにa を返すこともできます。これは(シャットダウンが開始される前に、シャットダウンが発生するたびに既に登録されているように) への呼び出しで行われます。IService.stopService
Deferred
reactor.addSystemEventTrigger('before', 'shutdown', callable)
service.tacは、カスタム サービスの作成と使用の例を示しています。
wxacceptance.pyaddSystemEventTrigger
は、シャットダウンを (任意の) 3 秒遅らせて使用する例を示しています。
これらのメカニズムはどちらも、リアクターが停止するたびに通知を送信します。これは、Cc キーストロークが原因である可能性があります。kill -INT ...
または、誰かが を使用したためか、どこかreactor.stop()
が呼び出されたためである可能性があります。それらはすべてリアクターのシャットダウンにつながり、リアクターのシャットダウンは常にシャットダウン イベント トリガーを処理します。