완료하는 데 시간이 너무 오래 걸리는 경우 시간 초과
방문하여 스크린샷을 찍고 싶은 URL:s가 포함된 텍스트 파일을 순환하는 셸 스크립트가 있습니다.
이 모든 것은 간단하고 간단합니다.이 스크립트는 클래스를 초기화하여 실행할 때 목록에 있는 각 사이트의 스크린샷을 만듭니다.일부 사이트는 로드하는 데 매우 매우 오랜 시간이 걸리고 일부 사이트는 로드되지 않을 수 있습니다.그래서 스크린그래버 함수를 타임아웃 스크립트로 래핑하여 함수를 반환하고 싶습니다.False
10초 안에 끝낼 수 없다면요
저는 가능한 가장 간단한 해결책에 만족합니다. 함수 내부에서 실제로 무슨 일이 일어나든 10초 후에 False를 반환하는 비동기 타이머를 설정하는 것이 어떨까요?
작업 시간 초과 프로세스는 신호 설명서에 설명되어 있습니다.
기본 아이디어는 신호 처리기를 사용하여 일정 시간 간격으로 알람을 설정하고 타이머가 만료되면 예외를 발생시키는 것입니다.
UNIX에서만 작동합니다.
다음은 데코레이터를 만드는 구현체입니다. (다음 코드를 다음과 같이 저장합니다.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
# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1():
...
# Timeout after 5 seconds
@timeout(5)
def long_running_function2():
...
# Timeout after 30 seconds, with the error "Connection timed out"
@timeout(30, os.strerror(errno.ETIMEDOUT))
def long_running_function3():
...
나는 데이비드의 대답을 다시 썼습니다.with
다음과 같은 작업을 수행할 수 있습니다.
with timeout(seconds=3):
time.sleep(4)
그러면 시간 초과 오류가 발생합니다.
코드가 여전히 사용 중입니다.signal
따라서 UNIX만 해당:
import signal
class timeout:
def __init__(self, seconds=1, error_message='Timeout'):
self.seconds = seconds
self.error_message = error_message
def handle_timeout(self, signum, frame):
raise TimeoutError(self.error_message)
def __enter__(self):
signal.signal(signal.SIGALRM, self.handle_timeout)
signal.alarm(self.seconds)
def __exit__(self, type, value, traceback):
signal.alarm(0)
언급URL : https://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish
'programing' 카테고리의 다른 글
.bashrc, .bash_profile 및 .environment의 차이점은 무엇입니까? (0) | 2023.07.01 |
---|---|
Global.asax에서 Application_Start와 Init을 사용하는 경우 (0) | 2023.07.01 |
테마를 사용해야 합니다.이 활동의 AppCompat 테마(또는 하위) (0) | 2023.07.01 |
Firebase에서의 다대다 관계 (0) | 2023.07.01 |
속성의 최종 목록 나열 - Spring Cloud Config Server (0) | 2023.07.01 |