ホームページ >バックエンド開発 >Python チュートリアル >長時間実行されるシェル スクリプト関数のタイムアウトを実装するにはどうすればよいですか?

長時間実行されるシェル スクリプト関数のタイムアウトを実装するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-03 18:20:11934ブラウズ

How Can I Implement Timeouts for Long-Running Shell Script Functions?

長時間にわたるシェル スクリプト関数のタイムアウト実装

シェル スクリプトでは、特定の関数の実行に過度に時​​間がかかり、遅延が発生する状況が発生することがあります。あるいは無限ループさえあります。これを防ぐには、指定された時間枠内にそのような関数が完了しない場合に終了するタイムアウトを実装するのが一般的です。

効果的なアプローチの 1 つは、非同期タイマーを使用してタイムアウトを強制することです。タイマーを設定すると、指定された期間を超えた場合に関数を終了でき、スクリプトが意図したとおりに実行し続けることが保証されます。

これを実装するには、Python が提供するシグナル モジュールを利用できます。タイムアウト デコレータを定義して関数をラップする方法は次のとおりです。

import signal
import functools

class TimeoutError(Exception):
    pass

def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise TimeoutError(error_message)

        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result

        return wrapper

    return decorator

タイムアウト デコレータを取得したら、設定したタイムアウト後に終了したい関数にそれを適用できます。たとえば、10 秒後にタイムアウトしたい long_running_function という関数がある場合、次のように装飾できます。

from timeout import timeout

@timeout
def long_running_function():
    ...

タイムアウト デコレータを使用すると、シェル スクリプト関数がタイムアウトするのを効果的に防ぐことができます。執行が長期化したため無期限絞首刑となる。このアプローチにより、不必要な遅延や中断が発生することなくスクリプトが確実に実行され続けることが保証されます。

以上が長時間実行されるシェル スクリプト関数のタイムアウトを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。