Я делал нечто подобное ранее, где я использую signal
, чтобы вызвать ошибку, когда время, которое я выделил, истекло, в основном TimeOutError
.У меня есть это как обертка функции, которую я могу удобно использовать как @timeout(seconds=<number_of_seconds>)
.Смотрите код ниже:
import signal
from functools import wraps
class TimeOutError(Exception):
pass
def timeout(seconds):
def decorator(func):
def _handle_timeout(signum, frame):
raise TimeOutError()
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 wraps(func)(wrapper)
return decorator
# Using it as a function wrapper
@timeout(seconds=10)
def run():
while True: x = raw_input("Enter Stuff here:")
# Then calling it as such
try:
run()
except TimeOutError:
print("You have exceeded the allotted time!")