Установка ограничения времени ожидания в Windows с Python 3.7 - PullRequest
1 голос
/ 29 мая 2019

У меня есть функция, которая не должна запускаться слишком долго.Я хотел бы установить ограничение тайм-аута на это.Я могу найти одно из предложенных решений в Интернете.Смотрите следующий пост. Время ожидания при вызове функции

Решение использует сигналы, которые недоступны в Windows.Аналогичным образом используются сигналы для создания тикера, в котором есть порт windows, как описано в этом сообщении SO: python: эквивалент окна SIGALRM , это не ответ на тайм-аут напрямую, но его можно адаптироватьработать на тайм-ауты.Это написано для Python 2.7 хотя.

Поскольку ответы примерно 10 лет, мой вопрос: есть ли какой-нибудь более современный Python (например, Python 3.7) способ создать менеджер контекста / декоратор / подобную оболочку сделатьсделать "нормальную функцию" в функцию с ограниченным временем ожидания в системе Windows?

1 Ответ

1 голос
/ 29 мая 2019

Вот способ преобразования @ 1001 * ответа @ Praveenkumar в простой в использовании декоратор, который, как вам кажется, сейчас хотелось бы знать:

import time
import concurrent.futures as futures


def timeout(timelimit):
    def decorator(func):
        def decorated(*args, **kwargs):
            with futures.ThreadPoolExecutor(max_workers=1) as executor:
                future = executor.submit(func, *args, **kwargs)
                try:
                    result = future.result(timelimit)
                except futures.TimeoutError:
                    print('Timedout!')
                    raise TimeoutError from None
                else:
                    print(result)
                executor._threads.clear()
                futures.thread._threads_queues.clear()
                return result
        return decorated
    return decorator


@timeout(3)
def test(n):
    print(f'Sleeping for {n} seconds')
    time.sleep(n)
    # Real code here.
    return 'Done'

test(2)  # OK
test(5)  # -> Causes timeout.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...