У меня этот декоратор взят непосредственно из примера, который я нашел в сети:
class TimedOutExc(Exception):
pass
def timeout(timeout):
def decorate(f):
def handler(signum, frame):
raise TimedOutExc()
def new_f(*args, **kwargs):
old = signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout)
try:
result = f(*args, **kwargs)
except TimedOutExc:
return None
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
new_f.func_name = f.func_name
return new_f
return decorate
Он выдает исключение, если функция f истекает.
Что ж, это работает, но когда я использую этот декоратор для многопроцессорной функции и останавливаюсь из-за тайм-аута, он не завершает процессы, участвующие в вычислениях. Как я могу это сделать?
Я не хочу запускать исключение и останавливать программу. В основном я хочу, чтобы по истечении времени f он возвращал None, а затем завершал задействованные процессы.