Если функция будет работать долго, и при этом нужно чтобы она работала не дольше определенного количества секунд, можно применить такой вот декоратор:
import errno import os import signal from functools import wraps class TimeoutError(Exception): pass def timeout(seconds=10, error_message=os.strerror(errno.ETIME)): """ @timeout(60) def long_functions(): <your code here> """ def decorator(func): def _handle_timeout(signum, frame): raise TimeoutError(error_message) 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
1 комментарий:
Если есть celery, то можно ее стандартными возможностями сделать timeout.
Отправить комментарий