Что такое сопрограммаpython-87

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

Ключевые особенности сопрограмм

  1. Приостановка и возобновление — могут останавливаться в одной точке и продолжать с неё
  2. Сохранение состояния — локальные переменные сохраняются между вызовами
  3. Двусторонний обмен данными — могут принимать и возвращать значения
  4. Кооперативная многозадачность — добровольно уступают контроль

Как объявить сопрограмму

Сопрограммы создаются с помощью ключевого слова async def:

async def my_coroutine():
    print("Start coroutine")
    await asyncio.sleep(1)
    print("End coroutine")

Основные компоненты сопрограмм

1. async def

Объявляет функцию как сопрограмму (начиная с Python 3.5)

2. await

Приостанавливает выполнение сопрограммы до завершения awaitable-объекта:

async def fetch_data():
    print("Fetching data...")
    await asyncio.sleep(2)  # Приостановка на 2 секунды
    return "Data received"

3. Event Loop

Для выполнения сопрограмм необходим цикл событий:

import asyncio

async def main():
    await fetch_data()

asyncio.run(main())  # Запуск цикла событий

Отличие сопрограмм от генераторов

Характеристика Сопрограммы Генераторы
Синтаксис async def, await yield, yield from
Возвращаемое значение Awaitable-объект Итератор
Основное назначение Асинхронные операции Ленивые вычисления
Версия Python 3.5+ 2.2+

Практические примеры

1. Простая сопрограмма

async def greet(name):
    print(f"Hello, {name}")
    await asyncio.sleep(1)
    print(f"Goodbye, {name}")

asyncio.run(greet("Alice"))

2. Параллельное выполнение

async def task1():
    await asyncio.sleep(1)
    return "Task 1 done"

async def task2():
    await asyncio.sleep(2)
    return "Task 2 done"

async def main():
    results = await asyncio.gather(task1(), task2())
    print(results)  # ['Task 1 done', 'Task 2 done']

asyncio.run(main())

3. Сопрограмма с обработкой ошибок

async def risky_operation():
    try:
        await asyncio.sleep(1)
        raise ValueError("Something went wrong")
    except ValueError as e:
        print(f"Caught error: {e}")
        return None

asyncio.run(risky_operation())

Жизненный цикл сопрограммы

  1. Создание — при вызове async-функции возвращается coroutine-объект
  2. Выполнение — запускается с помощью event loop
  3. Приостановка — при встрече await
  4. Возобновление — когда awaitable-объект завершается
  5. Завершение — возврат результата или исключение

Применение сопрограмм

  1. Асинхронные HTTP-запросы (aiohttp)
  2. Работа с базами данных (asyncpg, databases)
  3. Веб-сокеты (websockets)
  4. Потоковая обработка данных
  5. Микросервисная архитектура

Резюмируем

Сопрограмма — это:

  1. Специальная функция, объявленная через async def
  2. Может приостанавливаться (await) и возобновляться
  3. Используется для асинхронного программирования
  4. Требует event loop для выполнения
  5. Позволяет писать неблокирующий код
  6. Основа современного асинхронного Python (asyncio)

Сопрограммы особенно полезны для I/O-bound приложений, где важно эффективно использовать время ожидания операций ввода-вывода.