Color
@Color
Golang SWE, Cloud & DevOps

Как остановить выполнение функции в python?

Делаю расширение для уже существующей крупной программы.
Необходимо остановить выполнение функции по прошествии некоторого таймаута.

Пробую так (взял на SO):

сlass TimeoutError(Exception):
    pass


def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
    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

...

@timeout(5)
def some_method()
    ....
    pass

try:
    some_method()
except TimeoutError:
    error_handling()

На что получаю ошибку:
Failed (<type 'exceptions.ValueError'>):  signal only works in main thread

В общем, смысл ошибки понятен, но изменить ничего в самой программе не могу, соответственно мое расширение всегда будет не в main thread.

Подскажите, как можно пофиксить приведенный код, или же что можно использовать вместо этого.
Могу использовать только стандартные батарейки.
  • Вопрос задан
  • 13160 просмотров
Решения вопроса 1
@s1dney
Используйте мультипроцессинг, а не треды, там такое прокатит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы