Декоратор тайм-аута для функции многопроцессорной обработки

У меня этот декоратор взят непосредственно из примера, который я нашел в сети:

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, а затем завершал задействованные процессы.

6
задан Jeff LaFay 23 December 2011 в 13:35
поделиться