Обычно, если сопрограмма запускается с использованием функции asyncio.run(coroutine)
, прерывание клавиатуры (CTRL + C) или SIGINT отменяет все отложенные задачи в цикле событий. Ищу способ, при котором отменяется только основная задача (переданная asyncio.run(coroutine)
). Идея состоит в том, что основная задача затем будет организовывать отмену всех подзадач в любом порядке, который она сочтет нужным.
Рассмотрим пример:
import asyncio
async def main():
foo_task = asyncio.create_task(foo())
try:
await asyncio.sleep(10)
print('main finished')
finally:
print('ensuring foo task is finished')
await foo_task
async def foo():
await asyncio.sleep(10)
print('foo finished')
try:
asyncio.run(main())
except KeyboardInterrupt:
pass
Я хочу изменить приведенный выше код, чтобы, если в середине выполнения будет отправлено прерывание клавиатуры или SIGINT, foo_task
все равно будет завершен. Он должен напечатать следующее:
ensuring foo task is finished
foo finished
Я не хочу использовать экранирование (asyncio.shield(coroutine)
), потому что я хотел бы, чтобы основная задача имела полный контроль над порядком отмены / выполнения своих подзадач.