← Назад к вопросам

Что делает 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 — это оператор, который:

  1. Проверяет, что объект awaitable
  2. Приостанавливает корутину
  3. Отдаёт управление event loop'у
  4. Возобновляет корутину, когда результат готов
  5. Возвращает результат

Без await асинхронное программирование в Python невозможно.