おはようございます。
私は数多くのスレッドを持つプログラムを持っています。私の問題は、時には何人かの人がサーバをオフにしたりリブートしたりすることです(プログラムは会社のサーバで一日中実行されます)。私はLinuxシグナルのハンドラを作る方法があることを知っています。それらを使用させるすべてのスレッドが関数を実行してから作業を停止します。それを行う方法がありますか? Pあなたのシグナルハンドラからグローバル変数を設定してください、そして、あなたのスレッドが定期的にその値を確認することができます唯一の事についてLinuxシグナルを受け取ってスレッドに介入する
1
A
答えて
1
:悪い英語
申し訳ありません。他の人のよう
1
は、すでに言及した、シグナルハンドラは、(特にマルチスレッドのプログラムでは、原因の制約に)乱雑得ることができますので、それは別のオプションを選択した方が良いでしょう:
は取り扱いのための専用のスレッドを持っています信号はsigwaitinfo経由です - しかし、悪いニュースは、pythonはそれをそのままの形でサポートするようには見えないということです。
Linux専用のsignalfdを使用して信号を処理します(別のスレッドまたはイベントループに統合されています)。少なくとも使用可能なモジュールはpython-signalfdです。
ここでシグナルハンドラをインストールする必要がないとして、あなたは信号が通知され、きれいにあなたのプログラムの中で、他のスレッドをシャットダウンすることは容易であるべきときに何ができるかに制限はありません。
2
これを処理する最良の方法は、シャットダウン操作を一切必要としないことです。
たとえば、SIGTERMやSIGQUITなどのシグナルハンドラは、_exitを呼び出してクリーンアップなしでプロセスを終了できます。
Linuxでは(古代ではないスレッドの場合)、あるスレッドが_exitを呼び出すとき(または本当に望むならexit)、他のスレッドも停止します。
これは、クラッシュ専用の設計を実装しているため、これが有効です。
サーバのクラッシュ専用設計は、マシンがいつでもクラッシュする可能性があるという原則に基づいているため、このような障害から復旧できる必要があるため、通常の停止方法にしてください。とにかくサーバーが十分に堅牢である必要があるので、余分なコードは必要ありません。
関連する問題
- 1. linuxでシグナルを受け取る
- 2. BroadcastReceiverを介してACTION_BATTERY_CHANGEDを受け取った後、BatteryManager.Battery_Status_Fullを知っている
- 3. Linuxのすべてのスレッドにシグナルをブロードキャスト
- 4. iPhoneエラー:スレッド1:プログラム受信シグナル: "SIGABRT"
- 5. コンパイルエラーを受け取って、linuxのウィンドウにCをクロスコンパイルします。
- 6. PHP Webサービスを介してファイルを受け取る
- 7. ソケットを介してバイト配列を受け取る
- 8. C#入力を受け取っていないプロセス
- 9. Linuxでの複数スレッドによるシグナル処理
- 10. Linuxのターミナルアプリケーションでキープレスとキーリリースのイベントを受け取っていますか?
- 11. 受け取った入力に基づいてJSONからデータを取得
- 12. 結果セットを介して取得されたソケットを介してデータを受け取る方法は?
- 13. linux/QtでUSB通知を受け取るには?
- 14. 新しい要素を受け取ったときにスレッド内のループスルーリスト
- 15. まだユーザー入力を受け取っている非表示のフラグメント
- 16. IEを使ってsign_in/sign_upの後にエラーメッセージを受け取る
- 17. テーブルアダプタを使用して挿入によって影響を受ける行の数を取得する方法
- 18. PHPでJSONを受け取ってデータを使用する
- 19. 外部インターフェイスを介して複雑なjavascript値を受け取る
- 20. GAEは受け取っていないエラーを受け取っていません。ローカルテストを受けていません
- 21. Djangoは新しいエントリのみのシグナルを受け取ります
- 22. リフトスケールを取得して.jadeファイルを受け入れる
- 23. 受信トレイを読み取って、エラー#298を受け取りました
- 24. Qtシグナル/スロットとスレッド
- 25. レガシーコードの受け入れを受け入れる
- 26. SDL_PollEventがすべてのイベントを受け取っていない
- 27. テキストファイルを入力として受け取るバッチファイル
- 28. Pythonでユーザー入力としてイメージを受け取る方法
- 29. スレッド - メッセージ受け渡し
- 30. すぐにJSONが受け取ったIntを使用する
一般に、シグナルハンドラは、「async-safe」として文書化されたsyscallと、「再入可能」として文書化されたライブラリ関数を呼び出す必要があります。明らかにプログラムにスレッディングを追加すると、別のレイヤーが追加されるので、あきらめて「変数を設定する以外は何もしない」という誘惑を理解することができます。 – ephemient
「シグナルハンドラからは何もできません」とか、「Pythonは故意にスレッドを強制終了するためのAPIを持っていません。 –