0

スレッドを使用して、接続するクライアントごとにスレッドを開くソケットサーバーがあります。また、メンテナンス操作を行っている他の 2 つのスレッドが常に実行されています。

基本的に、メイン スレッドに加えて、常に実行されている 2 つの子スレッドと、接続するクライアントごとに 1 つの子スレッドがあります。

安全に終了または再起動できるようにしたい。

すべての子プロセスに安全に終了するように指示する終了関数をトリガーして、親を終了できるようにしたいと考えています。

何か案は?

クライアントとして接続し、それをトリガーするコマンドを送信することを提案しないでください。すでに考えました。

コンソールで何かを実行してこれを行う方法を探しています。

Python ソケット サーバーはシステム サービスとして実行され、init スクリプトで終了を実装したいと考えています。

4

1 に答える 1

1

これを行う最良の方法は、メインスレッドにシグナルハンドラーを設定することです。signalこれは、モジュールを使用して実行できます。http://docs.python.org/library/signal.htmlを参照してください。良い方法は、CTRL-Cシグナル(SIGINT)をトラップすることです。

シグナルハンドラーはクラスメソッドにすることもできるので、グローバルメソッドを使用する必要はないことに注意してください(それを見つけるのに時間がかかりました)。

 def __init__(self):
     signal.signal(signal.SIGINT, self.just_kill_me)

 def just_kill_me(self, sig, frame):
     self.stopped = True
     for t in self.threads:
         t.join()

キル信号に相当するものをスレッドに送信することはできません。代わりに、子供たちに停止するように合図するフラグを設定する必要があります。

子スレッドはループで実行され、親が停止を要求するかどうかを定期的にチェックする必要があります。

while not parent.stopped:
    do_some_maintenance_work
于 2012-09-14T23:11:19.710 に答える