ホームページ > バックエンド開発 > Python チュートリアル > リモート リソースにアクセスするときにシェル スクリプト関数がタイムアウトしないようにするにはどうすればよいですか?

リモート リソースにアクセスするときにシェル スクリプト関数がタイムアウトしないようにするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-30 13:02:19
オリジナル
249 人が閲覧しました

How Can I Prevent Shell Script Functions from Timing Out When Accessing Remote Resources?

タイムアウトした関数: 実行時間を制限する方法

シェル スクリプトでは、特に特定の関数が無限に実行されるのを防ぐと有益な場合があります。 URL などのリモート リソースへのアクセスが含まれる場合。タイムアウトを設定すると、サーバーが遅いか応答しないために関数がスクリプトをフリーズしないようにすることができます。

タイムアウトを実装する 1 つの方法は、シグナル モジュールのタイムアウト デコレータを利用することです。このデコレーターはシグナルのドキュメントで説明されており、シグナル ハンドラーを使用してアラームを設定します。指定された時間が経過すると、例外が発生し、関数が事実上停止します。

タイムアウト デコレータを使用するには、timeout.py モジュールからインポートし、引数としてタイムアウト期間 (秒単位) を指定します。以下は、デフォルトのタイムアウトが 10 秒のデコレータとカスタム エラー メッセージを作成するスニペットの例です。

import errno
import os
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
ログイン後にコピー

デコレータを使用するには、次のように長時間実行関数に適用するだけです。例:

# Default timeout of 10 seconds
@timeout
def long_running_function1():
    ...

# Timeout of 5 seconds
@timeout(5)
def long_running_function2():
    ...

# Timeout of 30 seconds, with custom error message 'Connection timed out'
@timeout(30, os.strerror(errno.ETIMEDOUT))
def long_running_function3():
    ...
ログイン後にコピー

この実装は UNIX システムにのみ適用できることに注意してください。シグナル モジュールのデコレーターを使用してタイムアウトを実装することで、関数の実行時間を制御できるようになり、関数がシェル スクリプトを不必要に保留するのを防ぐことができます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート