Как использовать asyncio для асинхронного кода

онлайн тренажер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Как использовать asyncio для асинхронного кода? Подробное руководство для начинающих и профессионалов

В современном программировании высокая производительность и отзывчивость приложений имеют ключевое значение. Асинхронное программирование позволяет эффективно использовать ресурсы процессора и не блокировать выполнение программы при ожидании ввода-вывода, сетевых запросов или других медленных операций.

В Python для этих целей используется мощная стандартная библиотека — asyncio. В этой статье мы подробно рассмотрим, как использовать asyncio для написания асинхронного кода, объясним основные принципы работы и приведём практические примеры.


Что такое асинхронность и зачем она нужна?

Асинхронное программирование позволяет выполнять несколько операций одновременно без необходимости ожидания завершения каждой из них. Это особенно полезно в следующих случаях:

  • Сетевые запросы (HTTP-запросы, работа с API).

  • Чтение и запись файлов.

  • Взаимодействие с базами данных.

  • Задержки, связанные с вводом-выводом.

Асинхронность позволяет «не простаивать» во время ожидания ответа от внешнего ресурса, а выполнять другие задачи.


Что такое asyncio?

asyncio — это стандартная библиотека Python для написания асинхронного кода, работающего на основе событийного цикла (event loop).

С помощью asyncio вы можете:

  • Создавать и запускать корутины.

  • Работать с асинхронными задачами и потоками.

  • Эффективно управлять большим числом сетевых соединений.


Основные концепции asyncio

1. Корутины (coroutines)

Корутина — это функция, которая может быть приостановлена и позже возобновлена. В Python корутины определяются с помощью ключевого слова async.

python
import asyncio async def greet(): print("Привет!") await asyncio.sleep(1) print("Прошло 1 секунда.")

Запуск корутины:

python
asyncio.run(greet())

2. Await — ожидание выполнения

Ключевое слово await используется для приостановки выполнения корутины до завершения другой асинхронной задачи.

python
async def delayed_message(): await asyncio.sleep(2) print("Сообщение через 2 секунды.") asyncio.run(delayed_message())

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

Это механизм, который управляет выполнением корутин и задач.

python
loop = asyncio.get_event_loop() loop.run_until_complete(greet())

Начиная с Python 3.7, предпочтительно использовать asyncio.run() вместо явного управления циклом.


Создание нескольких асинхронных задач

Асинхронный код по-настоящему раскрывает свою силу, когда нужно выполнить несколько задач параллельно.

python
async def task(name, delay): await asyncio.sleep(delay) print(f"Задача {name} завершена после {delay} секунд.") async def main(): await asyncio.gather( task("A", 2), task("B", 1), task("C", 3) ) asyncio.run(main())

Результат:
Задачи выполняются параллельно, несмотря на разные задержки.


Асинхронные HTTP-запросы с aiohttp

Для сетевых операций удобно использовать библиотеку aiohttp, которая работает с asyncio.

bash
pip install aiohttp

Пример асинхронного запроса:

python
import aiohttp import asyncio async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): html = await fetch('https://example.com') print(html) asyncio.run(main())

Обработка исключений в асинхронном коде

Асинхронный код поддерживает стандартные конструкции обработки ошибок.

python
async def risky_task(): try: await asyncio.sleep(1) raise ValueError("Что-то пошло не так!") except ValueError as e: print(f"Ошибка: {e}") asyncio.run(risky_task())

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

Использование asyncio оправдано, когда:

  • Необходима работа с большим числом сетевых соединений.

  • Нужно оптимизировать программы, связанные с ожиданием ввода-вывода.

  • Требуется писать высокопроизводительные и отзывчивые приложения, например, чаты, веб-серверы, телеграм-боты.


Чего не следует делать в асинхронном коде?

  • Не вызывайте синхронные блокирующие функции внутри асинхронного кода без обёрток.

  • Не используйте time.sleep() в асинхронных функциях — вместо этого используйте await asyncio.sleep().

  • Не смешивайте синхронный и асинхронный код без чёткого понимания последствий.


FAQ — Часто задаваемые вопросы

1. Можно ли использовать asyncio с потоками и процессами?

Да, но для этого следует использовать run_in_executor или сторонние библиотеки, такие как concurrent.futures.


2. Чем отличаются async/await от потоков (threading)?

Асинхронность работает в одном потоке и управляется циклом событий, а потоки используют многопоточность. Асинхронный код легче контролировать и он менее затратный по ресурсам.


3. Как правильно запускать асинхронный код в Jupyter Notebook?

В Jupyter можно использовать:

python
import nest_asyncio nest_asyncio.apply()

4. Можно ли комбинировать asyncio с библиотекой requests?

Непосредственно нет. Библиотека requests блокирующая. Для асинхронных HTTP-запросов используйте aiohttp.


5. Что лучше использовать: asyncio или многопроцессорность?

Если основная нагрузка связана с вводом-выводом — используйте asyncio. Если вычислительная нагрузка — лучше применять многопроцессорность.


6. Какие популярные фреймворки используют asyncio?

  • FastAPI

  • Starlette

  • AIOHTTP

  • Sanic


Заключение

Асинхронное программирование в Python — это мощный инструмент для создания быстрых и эффективных приложений. С помощью библиотеки asyncio можно писать неблокирующий, отзывчивый и масштабируемый код.

Теперь вы знаете, как использовать async и await, запускать несколько задач одновременно и работать с асинхронными сетевыми запросами. Используйте эти знания для создания более производительных и современных приложений!

Новости