Что такое async / asyncio в Python

Tags:

Published 29 августа 2025 г. 11:40 by max_summer

В Python async и asyncio — это механизмы для написания асинхронного кода, который позволяет эффективно выполнять неблокирующие операции ввода-вывода (I/O), такие как сетевые запросы, работа с файлами, базами данных и т. д.


1. Основные понятия

Асинхронность (Asynchronous Programming)

async / await

asyncio


2. Пример асинхронного кода

Без асинхронности (блокирующий код)

```python import time

def fetch_data(): print("Запрашиваем данные...") time.sleep(2) # Блокирует выполнение на 2 секунды return "Данные получены"

start = time.time() fetch_data() fetch_data() print(f"Время выполнения: {time.time() - start:.2f} сек") **Вывод:** Запрашиваем данные... Запрашиваем данные... Время выполнения: 4.00 сек ``` → Запросы выполняются последовательно, общая задержка — 4 секунды.


С асинхронностью (asyncio)

```python import asyncio

async def fetch_data(): print("Запрашиваем данные...") await asyncio.sleep(2) # Неблокирующая задержка return "Данные получены"

async def main(): start = time.time() task1 = asyncio.create_task(fetch_data()) task2 = asyncio.create_task(fetch_data()) await task1 await task2 print(f"Время выполнения: {time.time() - start:.2f} сек")

asyncio.run(main()) **Вывод:** Запрашиваем данные... Запрашиваем данные... Время выполнения: 2.00 сек ``` → Запросы выполняются параллельно, общая задержка — 2 секунды.


3. Ключевые компоненты asyncio

1. Корутина (coroutine)

```python async def my_coroutine(): return 42

result = await my_coroutine() # Вернёт 42 ```

2. Задача (Task)

python async def main(): task = asyncio.create_task(fetch_data()) await task # Ждём завершения задачи

3. Цикл событий (Event Loop)

```python async def main(): print("Hello") await asyncio.sleep(1) print("World")

asyncio.run(main()) # Запускает event loop ```

4. asyncio.gather()

python async def main(): results = await asyncio.gather( fetch_data(), fetch_data(), fetch_data() ) print(results) # ["Данные получены", "Данные получены", "Данные получены"]

5. asyncio.wait()

python async def main(): tasks = [asyncio.create_task(fetch_data()) for _ in range(3)] done, pending = await asyncio.wait(tasks) for task in done: print(task.result())


4. Когда использовать asyncio?

I/O-bound задачи (сетевые запросы, работа с БД, файлами). ✅ Высоконагруженные серверы (FastAPI, aiohttp). ✅ Параллельное выполнение независимых операций.

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


5. Популярные библиотеки для асинхронной работы

| Библиотека | Назначение | |------------|------------| | aiohttp | Асинхронные HTTP-запросы | | aiomysql | Асинхронная работа с MySQL | | asyncpg | Асинхронная работа с PostgreSQL | | FastAPI | Асинхронный веб-фреймворк | | httpx | Асинхронный HTTP-клиент |


6. Пример: Асинхронный HTTP-запрос с aiohttp

```python import aiohttp import asyncio

async def fetch_url(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text()

async def main(): urls = [ "https://example.com", "https://python.org", "https://github.com" ] tasks = [fetch_url(url) for url in urls] results = await asyncio.gather(*tasks) for url, content in zip(urls, results): print(f"{url} — {len(content)} байт")

asyncio.run(main()) ```


7. Подводные камни asyncio

  1. Блокирующие вызовы (например, requests.get(), time.sleep()) замораживают event loop. → Используйте асинхронные аналоги (aiohttp, asyncio.sleep()).
  2. Глобальный event loop — в некоторых случаях может потребоваться явное управление (asyncio.get_event_loop()).
  3. Отладка — асинхронный код сложнее отлаживать из-за нелинейного выполнения.
  4. Синхронизация — при работе с общими ресурсами нужны asyncio.Lock(), asyncio.Semaphore().

8. Заключение

🚀 Когда использовать? - Веб-скрапинг (aiohttp). - Веб-серверы (FastAPI, aiohttp). - Работа с базами данных (asyncpg, aiomysql). - Микросервисы с высокой нагрузкой.

Если у вас есть дополнительные вопросы — спрашивайте! 😊

Share this post

Similar posts

There are no similar posts yet.

0 comments

There are no comments

Add a new comment