>백엔드 개발 >파이썬 튜토리얼 >미리 정의된 기간을 사용하여 쉘 스크립팅에서 시간 초과 기능을 구현하는 방법은 무엇입니까?

미리 정의된 기간을 사용하여 쉘 스크립팅에서 시간 초과 기능을 구현하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-07 11:25:15331검색

How to Implement a Timeout Function in Shell Scripting with a Predefined Duration?

지속 시간이 미리 정의된 시간 초과 기능

쉘 스크립팅에서는 과도한 대기를 피하기 위해 장기 실행 작업을 종료하는 메커니즘을 갖는 것이 유용합니다. . 여기서 직면한 과제는 시간 초과 스크립트 내에서 함수를 래핑하여 지정된 시간 제한을 초과하는 경우 False를 반환하는 것입니다.

한 가지 접근 방식은 미리 정의된 간격 후에 False 응답을 트리거하는 비동기 타이머를 설정하는 것입니다. 다행스럽게도 이러한 솔루션은 signal 라이브러리(UNIX 기반 시스템에서 사용 가능)의 신호 처리기를 사용하여 달성할 수 있습니다.

이 프로세스에는 신호를 활용하는 사용자 정의 데코레이터(@timeout)를 만드는 작업이 포함됩니다. Alarm()은 원하는 시간 간격으로 알람을 설정합니다. 장식된 함수 내에서 알람이 만료되면 TimeoutError 예외가 발생하여 작업이 효과적으로 중단됩니다.

이 솔루션을 코드에 통합하려면 다음 코드를 timeout.py로 저장하고 가져오기:

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

이제 애플리케이션 코드 내에서 @timeout 데코레이터를 사용하여 잠재적으로 장기 실행되는 함수에 주석을 답니다. 예:

from timeout import timeout

# Short timeout
@timeout(5)
def slow_function():
    # ...

# Default timeout
@timeout
def another_slow_function():
    # ...

# Customize timeout and error message
@timeout(30, error_message="Task timed out")
def yet_another_slow_function():
    # ...

이 접근 방식을 사용하면 함수가 지정된 시간 초과 간격보다 오래 걸리는 경우 TimeoutError가 발생하고 False를 반환하므로 예상치 못한 지연을 적절하게 처리할 수 있습니다.

위 내용은 미리 정의된 기간을 사용하여 쉘 스크립팅에서 시간 초과 기능을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.