3

threading.Timerを使用して操作の60秒のタイムアウトを実装するPythonコードがあります。

問題は、このコードがジョブ制御環境で実行され、優先度の高いジョブによって横取りされる可能性があることです。この場合、SIGSTOPが送信され、しばらくしてSIGCONTが送信されます。どういうわけかこれが起こったことに気づき、タイムアウトをリセットする方法が必要です。明らかに、60秒間中断された場合、操作は実際にはタイムアウトしていません。

SIGCONTのシグナルハンドラーを追加しようとしましたが、threading.Timerに提供されたコードが実行された後に実行されるようです。

これを達成する方法はありますか?

4

3 に答える 3

2

これを投稿した後に私が思いついた非常に簡単な答えは、タイマーを複数のサブタイマーに分割することです。たとえば、それぞれがチェーン内の次のタイマーを開始する代わりに、10個の6秒タイマーを使用します。そうすれば、一時停止された場合でも、タイマーの1つだけが失われ、タイムアウトする前にほとんどの待機時間が発生します。

もちろん、これは絶対確実ではありません。特に、一時停止と再起動を繰り返した場合はそうですが、簡単に実行でき、十分なようです。

于 2012-06-12T06:35:16.750 に答える
1

何を求めているのかを再考する必要があります。タイムアウトは経過時間 (壁時間) を反映します。プロセスで使用された時間を知りたい場合。

幸いなことに、これを次の方法で測定できますgetrusage: http://docs.python.org/library/resource.html

タイムアウトを設定する必要があります。戻ったら、操作の開始以降のユーザーまたはシステム時間の使用量の増加を測定し、制限を超えている場合は操作を終了します。それ以外の場合は、タイムアウトを適切に再スケジュールします。

于 2012-06-11T15:58:13.743 に答える
0

アプリケーションがマルチスレッドの場合、ドキュメントには次のように記載されています。

メイン スレッドだけが新しいシグナル ハンドラを設定でき、メイン スレッドだけがシグナルを受信します。

メインスレッドからのシグナルを処理していることを確認してください。

于 2012-06-11T17:00:06.140 に答える