2016-11-11 6 views
2

私は、いくつかのデータ解析を扱うGCEサーバーのセットアップをしています。私はwstwistedを使ってそれと通信することができます。私はこのサーバーの唯一のクライアントです。それはクライアントの接続を処理しているので、sigtermで反応炉を強制停止させる

spawn_multiprocessing_hierarchy() 
reactor.run() # Blocks main thread 
stop_everything_and_cleanup() 

私はシステムを停止しようとしていると、クライアントが接続されている場合、reactorは無視(あるいは無期限延期?)しますSIGTERM

システムは、このような設定です。ただし、システムの他のすべての部分はフォールトトレラントであり、reactor決してハンドル任意の重要なデータです。それはモニタ目的のためだけに存在します。これは、私が容易にSIGKILLを行うことができたことを意味します。multiprocess.Processは、次回の起動時に最後に停止した場所でデータをダンプする必要があります。

SIGTERMを直ちに(リアクタ内のタスクの実行を待たずに)接続を切断してリアクタを停止させることは可能ですか?

答えて

0

コードの残りの部分を見ることなく、正確な問題が何であるかを想定するのは難しいです。一般に、原子炉が停止しない場合は、タスクがスレッドまたはプロセスで実行されているためです。 Twistedは「正しいこと」を実行しようとし、終了する前にすべてのスレッド/プロセスが終了するまで待機します。リアクターがreactor.addSystemEventTriggerで停止しているときにイベントを追加できます。

+0

タスクが実行されているため、リアクトルが停止しないことがわかります。ただ1台のクライアントしかサーバに接続していないことを考えれば、私はリアクタに非常に長いタスクを実行させても問題ありません。私は原子炉をミッションクリティカルなことがないので何をしていても落とさせたいと思っています。 – Mirac7

+0

これを回避する方法の1つは、Twisted(つまり '' reactor.spawnProcess''、 '' task.deferToThread''、 '' threads.callInThread''など)によるプロセスの生成ではなく、プロセスオブジェクトを手動で管理し、 'daemon = True''です。この方法では、Twistedはスレッド/プロセスを気にせず、アプリケーションが停止したときに単に「死ぬ」だけです。 –

関連する問題