Отмена корутин и обработка отмены
Python
Senior
Яндекс
Как корректно обрабатывать отмену задач в `asyncio` (например, при таймауте)? Какие исключения возникают и что важно не забыть при очистке ресурсов?
Ответы
Отмена задач asyncio
Отмена задачи в `asyncio` делается через `task.cancel()`. В корутине при этом поднимается `asyncio.CancelledError`, который нужно либо пробросить, либо корректно обработать.
Пример:
```python
import asyncio
async def worker():
try:
await asyncio.sleep(10)
except asyncio.CancelledError:
# очистка ресурсов
print('cancelled')
raise
async def main():
task = asyncio.create_task(worker())
await asyncio.sleep(1)
task.cancel()
try:
await task
except asyncio.CancelledError:
pass
```