Асинхронные функции в Python

Понимание и использование асинхронных функций в Python

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

Асинхронное программирование — это способ обработки нескольких задач одновременно. Вместо последовательного выполнения задач, асинхронное программирование позволяет вашему коду выполнять другие задачи в то время, когда текущая задача ожидает (например, во время ожидания ответа от сервера).

Модуль asyncio

Python имеет встроенный модуль для асинхронного программирования под названием asyncio. Он включает в себя инструменты для создания асинхронного кода с использованием синтаксиса async и await.

  • async определяет функцию как «асинхронную функцию корутины». Это означает, что функция будет возвращать специальный объект корутины, который может быть ожидаемым.
  • await используется для приостановки выполнения функции до завершения ожидаемого объекта (например, другой асинхронной функции).

Простой пример асинхронной функции

Вот простой пример асинхронной функции в Python:

import asyncio

async def hello_world():
    print("Hello")
    await asyncio.sleep(1)
    print("world!")

# Python 3.7+
asyncio.run(hello_world())

В этом примере функция hello_world() печатает «Hello», затем «засыпает» на 1 секунду, прежде чем печатать «world!». Функция asyncio.run() используется для запуска корутины.

Асинхронные задачи и asyncio.gather

Мы можем использовать asyncio.gather для запуска нескольких корутин одновременно:

import asyncio

async def count_to_three():
    for i in range(1, 4):
        print(i)
        await asyncio.sleep(1)

async def main():
    await asyncio.gather(count_to_three(), count_to_three())

# Python 3.7+
asyncio.run(main())

Здесь функция count_to_three() считает до трёх, делая паузу на 1 секунду после каждого числа. Функция main() запускает две такие функции одновременно.

Асинхронные и синхронные вызовы

В асинхронном программировании важно понимать разницу между асинхронными и синхронными вызовами. Вот простой пример:

import asyncio
import time

async def async_job(number):
    print(f"Job {number} started")
    await asyncio.sleep(1)
    print(f"Job {number} finished")

def sync_job(number):
    print(f"Job {number} started")
    time.sleep(1)
    print(f"Job {number} finished")

# Асинхронный вызов
asyncio.run(async_job(1))

# Синхронный вызов
sync_job(2)

В этом примере async_job() — это асинхронная функция, а sync_job() — синхронная функция. Они оба делают то же самое — печатают сообщение, засыпают на секунду и снова печатают сообщение. Однако асинхронный вызов async_job() может быть приостановлен и возобновлен, позволяя другому коду работать во время «сна», в то время как синхронный вызов sync_job() блокирует исполнение до тех пор, пока не завершится полностью.

Работа с асинхронными потоками

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

import aiohttp
import asyncio

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

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

# Python 3.7+
asyncio.run(main())

В этом примере мы используем библиотеку aiohttp для создания асинхронных HTTP-запросов. Функция fetch() делает запрос к URL и возвращает текст ответа. Функция main() создает сессию запросов и использует функцию fetch() для получения содержимого веб-страницы.

Асинхронные библиотеки и фреймворки

В Python существует несколько библиотек и фреймворков для асинхронного программирования.

  • asyncio — это встроенная библиотека Python для написания одновременно выполняющегося кода с использованием корутин, мультиплексирования ввода-вывода, сокетов и другого.
  • aiohttp — это библиотека для асинхронных HTTP-запросов.
  • FastAPI — это современный, быстрый (высокопроизводительный) веб-фреймворк для построения API с Python 3.6+ на основе стандартных Python-типов.

Заключение

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

Содержание: