おはようございます。
私は数多くのスレッドを持つプログラムを持っています。私の問題は、時には何人かの人がサーバをオフにしたりリブートしたりすることです(プログラムは会社のサーバで一日中実行されます)。私は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. スレッド1のシグナルを取得するSIGQUIT
- 6. ユーザー定義のシグナルを受け取ったときにプロセスがポーズしない
- 7. SOAP 1.1を介してxCBL XMLを受け入れるWCFサービス
- 8. コンパイルエラーを受け取って、linuxのウィンドウにCをクロスコンパイルします。
- 9. AJAXクエリでDjangoのpost_saveシグナルを受け取る方法は?
- 10. Linuxでの複数スレッドによるシグナル処理
- 11. ソケットを介してバイト配列を受け取る
- 12. PHP Webサービスを介してファイルを受け取る
- 13. セロリのエラー「0xceを受け取って0x00を受け取った」
- 14. ユニットを受け取って返すコールバックユニット
- 15. Linuxのターミナルアプリケーションでキープレスとキーリリースのイベントを受け取っていますか?
- 16. 必要な入力を受け取っていないプログラム
- 17. Scanfが入力文字を受け取っていない
- 18. Prestashop - AuthController.phpが入力値を受け取っていません
- 19. C#入力を受け取っていないプロセス
- 20. keyboard.next入力を受け取っていません
- 21. Linux .Netコア受け取りソケットで受け渡し
- 22. 受け取った入力に基づいてJSONからデータを取得
- 23. 結果セットを介して取得されたソケットを介してデータを受け取る方法は?
- 24. シグナルを受け取ったときにgdbコアのダンプを自動化する方法
- 25. スレッドとシグナル
- 26. スレッド内で()を受け入れることができます
- 27. 新しい要素を受け取ったときにスレッド内のループスルーリスト
- 28. Panelbarの入力がkendo-ui-angular2の入力を受け取っていない
- 29. linux/QtでUSB通知を受け取るには?
- 30. Paypal Oauthを介してユーザーから受け取った支払いを取得しますか?
一般に、シグナルハンドラは、「async-safe」として文書化されたsyscallと、「再入可能」として文書化されたライブラリ関数を呼び出す必要があります。明らかにプログラムにスレッディングを追加すると、別のレイヤーが追加されるので、あきらめて「変数を設定する以外は何もしない」という誘惑を理解することができます。 – ephemient
「シグナルハンドラからは何もできません」とか、「Pythonは故意にスレッドを強制終了するためのAPIを持っていません。 –