Корутины — это специальный тип функций, которые позволяют приостанавливать и возобновлять выполнение, сохраняя при этом состояние между вызовами. Они являются фундаментальной концепцией асинхронного программирования в Python.
await
)async def
: объявление корутиныawait
: точка приостановки выполненияasyncio.run()
: запуск корутиныimport asyncio
async def simple_coroutine():
print("Start")
await asyncio.sleep(1) # Точка приостановки
print("End")
async def fetch_data():
return await some_io_operation()
async def async_counter(n: int):
for i in range(n):
await asyncio.sleep(0.1)
yield i
async def async_context():
async with some_async_resource() as resource:
data = await resource.read()
await
управление возвращается в event loopasync def process_data():
raw = await fetch_data() # Приостановка до завершения fetch_data
processed = await parse_data(raw)
return processed
async def fetch_urls(urls):
tasks = [fetch_single_url(url) for url in urls]
return await asyncio.gather(*tasks)
async def websocket_handler(websocket):
async for message in websocket:
await process_message(message)
async def parallel_operations():
await asyncio.gather(
write_to_db(),
send_notification(),
update_cache()
)
Корутины построены на механизме генераторов, но с дополнительной функциональностью:
await
выраженийyield
производит значенияawait
потребляет значения (обычно другие асинхронные операции)time.sleep()
заблокирует весь event loopКорутины — это мощный инструмент для:
Пример с подсветкой (VSCode style):
import asyncio
from typing import AsyncIterator
async def data_stream(limit: int) -> AsyncIterator[int]:
"""Асинхронный генератор данных"""
for i in range(limit):
await asyncio.sleep(0.5) # Имитация I/O операции
yield i * 2
async def process_stream():
async for value in data_stream(5):
print(f"Обработано: {value}")
asyncio.run(process_stream())