2010-11-25 13 views
1

おはようございます。
私は数多くのスレッドを持つプログラムを持っています。私の問題は、時には何人かの人がサーバをオフにしたりリブートしたりすることです(プログラムは会社のサーバで一日中実行されます)。私はLinuxシグナルのハンドラを作る方法があることを知っています。それらを使用させるすべてのスレッドが関数を実行してから作業を停止します。それを行う方法がありますか? Pあなたのシグナルハンドラからグローバル変数を設定してください、そして、あなたのスレッドが定期的にその値を確認することができます唯一の事についてLinuxシグナルを受け取ってスレッドに介入する

答えて

1

:悪い英語

申し訳ありません。他の人のよう

+0

一般に、シグナルハンドラは、「async-safe」として文書化されたsyscallと、「再入可能」として文書化されたライブラリ関数を呼び出す必要があります。明らかにプログラムにスレッディングを追加すると、別のレイヤーが追加されるので、あきらめて「変数を設定する以外は何もしない」という誘惑を理解することができます。 – ephemient

+0

「シグナルハンドラからは何もできません」とか、「Pythonは故意にスレッドを強制終了するためのAPIを持っていません。 –

1

は、すでに言及した、シグナルハンドラは、(特にマルチスレッドのプログラムでは、原因の制約に)乱雑得ることができますので、それは別のオプションを選択した方が良いでしょう:

  • は取り扱いのための専用のスレッドを持っています信号はsigwaitinfo経由です - しかし、悪いニュースは、pythonはそれをそのままの形でサポートするようには見えないということです。

  • Linux専用のsignalfdを使用して信号を処理します(別のスレッドまたはイベントループに統合されています)。少なくとも使用可能なモジュールはpython-signalfdです。

ここでシグナルハンドラをインストールする必要がないとして、あなたは信号が通知され、きれいにあなたのプログラムの中で、他のスレッドをシャットダウンすることは容易であるべきときに何ができるかに制限はありません。

2

これを処理する最良の方法は、シャットダウン操作を一切必要としないことです。

たとえば、SIGTERMやSIGQUITなどのシグナルハンドラは、_exitを呼び出してクリーンアップなしでプロセスを終了できます。

Linuxでは(古代ではないスレッドの場合)、あるスレッドが_exitを呼び出すとき(または本当に望むならexit)、他のスレッドも停止します。

これは、クラッシュ専用の設計を実装しているため、これが有効です。

サーバのクラッシュ専用設計は、マシンがいつでもクラッシュする可能性があるという原則に基づいているため、このような障害から復旧できる必要があるため、通常の停止方法にしてください。とにかくサーバーが十分に堅牢である必要があるので、余分なコードは必要ありません。

関連する問題