@Zo0meeer

Почему asyncio event loop игнорирует KeyboardInterrupt?

Здравствуйте!
На мой взгляд, столкнулся с багом.
Есть функция main:
set_event_loop_policy(WindowsSelectorEventLoopPolicy())
    loop = get_event_loop()
    try:
        loop.run_until_complete(on_startup())
        loop.create_task(foo())
        loop.run_forever()
    except (KeyboardInterrupt, SystemExit):
        pass
    finally:
        loop.run_until_complete(on_shutdown())
        loop.stop()

Эта функция запускает корутину foo, которая в бесконечном цикле занимается парсингом:
@get_error(LOGGER)
async def foo() -> None:
    while True:
        await another_foo()
        await sleep(3600)

Что делает декоратор:
def get_error(logger: logging.Logger):
    """Получает ошибки в функциях и передаёт их логгеру."""
    def wrapper_1(function):
        @wraps(function)
        async def wrapper_2(*args, **kwargs):
            try:
                return await function(*args, **kwargs)
            except Exception as Error:
                logger.exception(Error)
        return wrapper_2
    return wrapper_1

Но KeyboardInterrupt он не отлавливает.
Что касается функции main, то она то реагирует на KeyboardInterrupt, то нет. И корутина on_shutdown() не срабатывает периодически. Видел в интернете, что это баг Windows, на Linux всё будет в порядке?
  • Вопрос задан
  • 475 просмотров
Пригласить эксперта
Ответы на вопрос 1
lxstvayne
@lxstvayne
Люблю Python
Не удивительно, документация
Ответ написан
Ваш ответ на вопрос

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

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