async for

В асинхронном программировании Python, ключевое слово async for используется для итерации по асинхронным итераторам. Этот механизм позволяет обрабатывать данные, которые поступают асинхронно, например, при работе с сетевыми соединениями, асинхронными потоками данных или асинхронными генераторами.

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

Асинхронные генераторы

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

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

import asyncio

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

async def main():
    async for value in async_generator():
        print(value)

asyncio.run(main())

В этом примере асинхронный генератор async_generator генерирует числа от 1 до 3 с задержкой в одну секунду между итерациями.

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

import aiohttp
import asyncio

async def fetch_lines(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            async for line in response.content:
                print(line.decode().strip())

async def main():
    url = 'https://example.com'
    await fetch_lines(url)

asyncio.run(main())