Перечислите основные сущности асинхронного программирования в Python

Ответ

В основе асинхронного программирования в Python с использованием библиотеки asyncio лежат следующие ключевые сущности:

  1. Корутина (Coroutine) Функция, объявленная с помощью async def. Является основным строительным блоком. Её выполнение можно приостановить и возобновить. Для получения результата корутины используется ключевое слово await.

    import asyncio
    
    async def get_data():
        print("Начало получения данных...")
        await asyncio.sleep(1) # Имитация I/O операции
        print("Данные получены")
        return {"data": 123}
  2. Задача (Task) Объект, который планирует и запускает выполнение корутины в цикле событий. Задачи позволяют корутинам выполняться параллельно (concurrently). Создаются с помощью asyncio.create_task().

    # ...внутри async функции
    task1 = asyncio.create_task(get_data())
    task2 = asyncio.create_task(get_data())
    
    await task1
    await task2
  3. Цикл событий (Event Loop) Ядро asyncio. Он управляет выполнением задач, отслеживает I/O операции и переключает контекст между корутинами, когда они ожидают завершения операции (await).

  4. Future Низкоуровневый объект, представляющий конечный результат асинхронной операции. Task является его подклассом. Обычно используется при работе с колбэками или при интеграции с низкоуровневым кодом.

  5. Асинхронные менеджеры контекста и итераторы Позволяют использовать конструкции async with и async for для асинхронного управления ресурсами и итерации по асинхронным последовательностям.

    # Пример асинхронного итератора
    class AsyncCounter:
        def __init__(self, limit):
            self.limit = limit
            self.counter = 0
    
        def __aiter__(self):
            return self
    
        async def __anext__(self):
            if self.counter < self.limit:
                await asyncio.sleep(0.1)
                self.counter += 1
                return self.counter
            else:
                raise StopAsyncIteration
    
    async def main():
        async for i in AsyncCounter(3):
            print(i)
    
    asyncio.run(main())
    # Вывод: 1, 2, 3