반응형
질문
I'm calling a function in Python which I know may stall and force me to restart the script.
How do I call the function or what do I wrap it in so that if it takes longer than 5 seconds the script cancels it and does something else?
답변
UNIX에서 실행 중이라면 signal 패키지를 사용할 수 있습니다:
In [1]: import signal
# 타임아웃을 위한 핸들러 등록
In [2]: def handler(signum, frame):
...: print("영원히 끝났습니다!")
...: raise Exception("시간 종료")
...:
# 이 함수는 무한히 실행될 수 있습니다...
In [3]: def loop_forever():
...: import time
...: while 1:
...: print("초")
...: time.sleep(1)
...:
...:
# 시그널 함수 핸들러 등록
In [4]: signal.signal(signal.SIGALRM, handler)
Out[4]: 0
# 함수에 대한 타임아웃 정의
In [5]: signal.alarm(10)
Out[5]: 0
In [6]: try:
...: loop_forever()
...: except Exception, exc:
...: print(exc)
....:
초
초
초
초
초
초
초
초
영원히 끝났습니다!
시간 종료
# 타임아웃 이전에 함수가 반환되면 타이머 취소
# (내 함수는 안 되지만, 당신의 함수는 될지도 모릅니다 :)
In [7]: signal.alarm(0)
Out[7]: 0
signal.alarm(10)
호출 후 10초 뒤에 핸들러가 호출됩니다. 이로 인해 일반적인 Python 코드에서 잡을 수 있는 예외가 발생합니다.
이 모듈은 스레드와 함께 사용하기가 어렵습니다 (하지만, 누가 잘 사용하겠습니까?)
타임아웃이 발생할 때 예외를 발생시키므로, 함수 내에서 예외가 잡혀 무시될 수 있음에 주의하세요. 예를 들어 다음과 같은 함수 중 하나에서:
def loop_forever():
while 1:
print('초')
try:
time.sleep(10)
except:
continue
반응형
댓글