タイムアウトによる長時間実行関数呼び出しのキャンセル
停止する可能性のある関数を含む複雑なスクリプトを実行する場合、次の方法を提供することが望ましいです。指定された実行時間を超えた場合、これらの関数は終了します。これにより、スクリプトが応答しなくなったり、無期限にスタックしたままになったりすることがなくなります。
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) を呼び出してタイマーをキャンセルします。
シグナル パッケージはマルチスレッド環境とうまく対話できない可能性があることに注意してください。さらに、関数がタイムアウト中に発生した例外をキャッチして無視した場合、タイムアウト メカニズムが効果的でない可能性があります。
以上がタイムアウトを使用して長時間実行される Python 関数をキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。