Здравствуйте!
На мой взгляд, столкнулся с багом.
Есть функция 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 всё будет в порядке?