asyncio — стандартная библиотека Python для написания конкурентного кода с использованием синтаксиса async/await. В этой статье рассмотрим практические сценарии применения.

Когда нужен asyncio?

asyncio отлично подходит для I/O-bound задач: HTTP-запросов, работы с базами данных, чтения файлов. Если ваш код большую часть времени ждёт ответа от сети или диска — asyncio даст заметный прирост производительности.

Для CPU-bound задач (вычисления, обработка данных) лучше использовать multiprocessing.

Базовый пример

import asyncio
import aiohttp

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = ["https://example.com", "https://python.org"]
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
    return results

asyncio.run(main())

Ключевые концепции

  • async def — объявление корутины. Вызов корутины не запускает её немедленно.
  • await — приостанавливает выполнение текущей корутины до получения результата.
  • asyncio.gather() — запускает несколько корутин конкурентно и ждёт завершения всех.
  • asyncio.create_task() — запускает корутину в фоне, не дожидаясь её завершения немедленно.

Интеграция с веб-фреймворками

FastAPI нативно поддерживает async/await. Flask 2.x также поддерживает асинхронные представления, но требует установки flask[async].

Практический совет

Не смешивайте синхронный и асинхронный код без необходимости. Если вы используете синхронную библиотеку внутри asyncio, оборачивайте вызов в loop.run_in_executor(), чтобы не блокировать event loop.