← Назад к вопросам
Что делает await в Python?
2.2 Middle🔥 221 комментариев
#Python Core#Асинхронность и многопоточность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что делает await в Python?
Фундаментальный вопрос об асинхронном программировании. Разберу глубоко.
Определение
await — это оператор, который приостанавливает выполнение текущей корутины и передаёт управление другим корутинам в event loop. Он ждёт результат асинхронной операции.
Как это работает под капотом
Когда встречаешь await, корутина паузируется. Event loop может выполнить другие корутины параллельно.
Что делает await технически
1. Проверка, что объект — awaitable
Объект должен быть:
- Корутина (определена с
async def) - Future/Task (из asyncio)
- Объект с await() методом
2. Передача управления event loop'у
Когда встречаешь await, корутина паузируется:
import asyncio
async def task1():
print("Task 1 start")
await asyncio.sleep(2)
print("Task 1 end")
async def task2():
print("Task 2 start")
await asyncio.sleep(1)
print("Task 2 end")
async def main():
await asyncio.gather(task1(), task2())
# Вывод:
# Task 1 start
# Task 2 start
# Task 2 end (через 1 сек)
# Task 1 end (через 2 сек)
# Время выполнения: 2 сек (не 3!)
3. Ожидание результата
Корутина возобновляется, когда операция завершена.
Важные правила
Await можно использовать ТОЛЬКО внутри async функции
# Правильно
async def main():
result = await some_coroutine()
return result
# Ошибка — SyntaxError
def not_async():
result = await some_coroutine()
Не забывай await перед корутиной
async def fetch():
return "data"
# Правильно
result = await fetch()
print(result)
# Без await — получишь объект корутины
result = fetch()
print(result) # <coroutine object fetch at 0x...>
await НЕ блокирует поток
Это главное отличие от синхронного кода:
import time
import asyncio
# Синхронный код: БЛОКИРУЕТ поток на 2 секунды
time.sleep(2)
# Асинхронный код: НЕ блокирует поток
await asyncio.sleep(2) # Event loop выполняет другие корутины
Практические примеры
Пример 1: Загрузка данных с API
import aiohttp
import asyncio
async def fetch_user(session, user_id):
async with session.get(f"https://api.example.com/users/{user_id}") as resp:
return await resp.json()
async def fetch_multiple_users(user_ids):
async with aiohttp.ClientSession() as session:
tasks = [fetch_user(session, uid) for uid in user_ids]
users = await asyncio.gather(*tasks)
return users
users = await fetch_multiple_users([1, 2, 3, 4, 5])
Пример 2: Обработка очереди задач
async def worker(name, queue):
while True:
task = await queue.get()
print(f"{name} processing {task}")
await asyncio.sleep(1)
queue.task_done()
async def main():
queue = asyncio.Queue()
workers = [asyncio.create_task(worker(f"Worker-{i}", queue)) for i in range(3)]
for task in range(10):
await queue.put(task)
await queue.join()
await vs asyncio.create_task()
# await: последовательно
async def sequential():
result1 = await operation1()
result2 = await operation2()
# asyncio.create_task(): параллельно
async def parallel():
task1 = asyncio.create_task(operation1())
task2 = asyncio.create_task(operation2())
result1 = await task1
result2 = await task2
Частые ошибки
Ошибка 1: Забыл await
async def fetch_data():
data = fetch_from_api()
return data
# Правильно
async def fetch_data():
data = await fetch_from_api()
return data
Ошибка 2: Await в синхронной функции
def sync_function():
result = await async_function() # SyntaxError!
# Правильно
async def async_wrapper():
result = await async_function()
Вывод
await — это оператор, который:
- Проверяет, что объект awaitable
- Приостанавливает корутину
- Отдаёт управление event loop'у
- Возобновляет корутину, когда результат готов
- Возвращает результат
Без await асинхронное программирование в Python невозможно.