私は、いくつかのデータ解析を扱うGCEサーバーのセットアップをしています。私はws
でtwisted
を使ってそれと通信することができます。私はこのサーバーの唯一のクライアントです。それはクライアントの接続を処理しているので、sigtermで反応炉を強制停止させる
spawn_multiprocessing_hierarchy()
reactor.run() # Blocks main thread
stop_everything_and_cleanup()
私はシステムを停止しようとしていると、クライアントが接続されている場合、reactor
は無視(あるいは無期限延期?)しますSIGTERM
:
システムは、このような設定です。ただし、システムの他のすべての部分はフォールトトレラントであり、reactor
決してハンドル任意の重要なデータです。それはモニタ目的のためだけに存在します。これは、私が容易にSIGKILL
を行うことができたことを意味します。multiprocess.Process
は、次回の起動時に最後に停止した場所でデータをダンプする必要があります。
SIGTERM
を直ちに(リアクタ内のタスクの実行を待たずに)接続を切断してリアクタを停止させることは可能ですか?
タスクが実行されているため、リアクトルが停止しないことがわかります。ただ1台のクライアントしかサーバに接続していないことを考えれば、私はリアクタに非常に長いタスクを実行させても問題ありません。私は原子炉をミッションクリティカルなことがないので何をしていても落とさせたいと思っています。 – Mirac7
これを回避する方法の1つは、Twisted(つまり '' reactor.spawnProcess''、 '' task.deferToThread''、 '' threads.callInThread''など)によるプロセスの生成ではなく、プロセスオブジェクトを手動で管理し、 'daemon = True''です。この方法では、Twistedはスレッド/プロセスを気にせず、アプリケーションが停止したときに単に「死ぬ」だけです。 –