タイムアウトによる長時間実行関数呼び出しのキャンセル
停止する可能性のある関数を含む複雑なスクリプトを実行するときは、次の方法を提供することが望ましいです。指定された実行時間を超えた場合、これらの関数を終了します。これにより、スクリプトが応答しなくなったり、無期限に停止したままになったりすることがなくなります。
Python では、シグナル パッケージ (UNIX システムで利用可能) を活用することで、この問題の解決策が得られます。シグナルハンドラーを登録すると、関数呼び出しのタイムアウトを設定できます。関数に指定された時間よりも時間がかかる場合は、ハンドラーが呼び出され、状況を適切に処理できるようになります。
次のコード スニペットを考えてみましょう:
import signal # Register a signal handler for the timeout def handler(signum, frame): print("Forever is over!") raise Exception("end of time") # Define a function that may run for an indetermined time def loop_forever(): import time while 1: print("sec") time.sleep(1) # Register the signal function handler signal.signal(signal.SIGALRM, handler) # Define a timeout for the function signal.alarm(10) try: loop_forever() except Exception as exc: print(exc) # Cancel the timer if the function returned before timeout signal.alarm(0)
この例では、タイムアウト信号を処理するハンドラー関数を登録します。次に、長時間実行されるloop_forever関数を定義します。この関数は、メッセージ「sec」を毎秒出力し続けます。
signal.alarm(10)を使用して10秒のタイムアウトを設定した後、loop_foreverの実行を試みます。関数の実行に 10 秒以上かかる場合は、シグナル ハンドラーが呼び出され、「永遠は終わりです!」と出力されます。
タイムアウト シナリオを適切に処理するには、指定された時間より前に関数が返された場合にタイマーをキャンセルすることが不可欠です。この例では、例外が発生したときに signal.alarm(0) を呼び出してタイマーをキャンセルします。
シグナル パッケージはマルチスレッド環境とうまく対話できない可能性があることに注意してください。さらに、関数がタイムアウト中に発生した例外をキャッチして無視する場合、タイムアウト メカニズムが効果的でない可能性があります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3