Функция тайм-аута, если занимает слишком много времени заканчиваться [копирует]

135
задан Aaron Hall 5 August 2015 в 03:13
поделиться

1 ответ

Процесс тайм-аута операций описан в документации для сигнала .

Основная идея состоит в том, чтобы использовать обработчики сигналов для установки будильника на некоторый интервал времени и создания исключения по истечении этого таймера.

Обратите внимание, что это работает только в UNIX.

Вот реализация, которая создает декоратор (сохраните следующий код как timeout.py ).

from functools import wraps
import errno
import os
import signal

class 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 , который можно применять к любым длительно выполняющимся функциям.

Итак, в коде вашего приложения вы можете использовать декоратор следующим образом:

from timeout import timeout

# Timeout a long running function with the default expiry of 10 seconds.
@timeout
def long_running_function1():
    ...

# Timeout after 5 seconds
@timeout(5)
def long_running_function2():
    ...

# Timeout after 30 seconds, with the error "Connection timed out"
@timeout(30, os.strerror(errno.ETIMEDOUT))
def long_running_function3():
    ...
217
ответ дан 23 November 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: