본문 바로가기
Python/Python FAQ

Python 함수 호출 시간 초과, Timeout on a function call

by 베타코드 2023. 10. 18.
반응형

질문


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
반응형

댓글