0Pricing
Python Academy · Урок

Корутины и цикл событий

Определяйте корутины с помощью async def и запускайте их с asyncio.run().

«Корутины и цикл событий» — бесплатный урок Python Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Что такое конкурентное выполнение?

Asyncio предоставляет кооперативную конкурентность: один поток обрабатывает множество задач, переключаясь между ними, когда одна из них ожидает выполнения операции ввода-вывода.

# Traditional: blocking I/O holds the whole thread
# Asyncio: while waiting for I/O, run other coroutines

import asyncio

async def main():
    print("Hello")
    await asyncio.sleep(1)   # yield control
    print("World")

asyncio.run(main())

async def — функции-корутины

Функции, определённые с помощью async def, являются функциями-корутинами. Их вызов возвращает объект-корутину; они выполняются только после ожидания или постановки в расписание.

import asyncio

async def greet(name):
    return f"Hello, {name}"

result = asyncio.run(greet("Alice"))
print(result)   # Hello, Alice

Цикл событий

Цикл событий управляет выполнением корутин. asyncio.run(coro) создаёт новый цикл событий, выполняет корутину до завершения и закрывает цикл.

import asyncio

async def compute():
    await asyncio.sleep(0)
    return 42

value = asyncio.run(compute())
print(value)   # 42

# For advanced use:
loop = asyncio.new_event_loop()
result = loop.run_until_complete(compute())
loop.close()

await приостанавливает выполнение

await expr приостанавливает текущую корутину, пока expr (другая корутина или будущее) не завершится. Тем временем цикл событий выполняет другие задачи.

import asyncio

async def task(name, delay):
    print(f"{name} starting")
    await asyncio.sleep(delay)
    print(f"{name} done")

async def main():
    await task("A", 2)
    await task("B", 1)   # sequential here

asyncio.run(main())

asyncio.sleep()

asyncio.sleep(seconds) приостанавливает текущую корутину на указанное время, не блокируя цикл событий.

import asyncio

async def heartbeat():
    while True:
        print("ping")
        await asyncio.sleep(1)

# asyncio.run(heartbeat())  # runs forever

Точка входа asyncio.run()

asyncio.run(coro) — стандартная точка входа верхнего уровня. Никогда не вызывайте её внутри работающего цикла событий.

import asyncio

async def main():
    print("running")

if __name__ == "__main__":
    asyncio.run(main())

Проверка нахождения внутри цикла событий

Используйте asyncio.get_running_loop(), чтобы определить, работает ли уже цикл (если нет, возникает RuntimeError).

import asyncio

async def inner():
    loop = asyncio.get_running_loop()
    print(f"Loop: {loop}")

asyncio.run(inner())

Выполнение блокирующего кода

Запускайте код с высокой нагрузкой на CPU или блокирующий ввод-вывод, не блокируя цикл событий, с помощью loop.run_in_executor(None, func, *args).

import asyncio, time

def blocking():
    time.sleep(2)
    return "done"

async def main():
    loop = asyncio.get_event_loop()
    result = await loop.run_in_executor(None, blocking)
    print(result)

asyncio.run(main())

Цепочки корутин

Корутины могут использовать await для ожидания других корутин, создавая цепочку. Управление движется вниз по цепочке и возвращается вверх по мере завершения каждого уровня.

import asyncio

async def fetch_data():
    await asyncio.sleep(1)
    return {"value": 42}

async def process():
    data = await fetch_data()
    return data["value"] * 2

async def main():
    result = await process()
    print(result)   # 84

asyncio.run(main())

Определение корутин

Используйте asyncio.iscoroutine(obj) или asyncio.iscoroutinefunction(func), чтобы проверять асинхронные функции во время выполнения.

import asyncio

async def my_coro():
    pass

print(asyncio.iscoroutinefunction(my_coro))   # True
coro = my_coro()
print(asyncio.iscoroutine(coro))              # True
coro.close()   # clean up the un-awaited coroutine

Режим отладки asyncio

Включите режим отладки, чтобы обнаруживать корутины, для которых не было выполнено ожидание, медленные обратные вызовы и другие проблемы: установите PYTHONASYNCIODEBUG=1 или передайте debug=True в asyncio.run.

import asyncio

async def main():
    pass

asyncio.run(main(), debug=True)

# Or:
# PYTHONASYNCIODEBUG=1 python script.py

Быстрая проверка

Что делает asyncio.run(coro)?

Итоги

Определяйте корутины с помощью async def, запускайте их с помощью asyncio.run() и приостанавливайте с помощью await. Цикл событий кооперативно планирует выполнение корутин, запуская другие, пока одна из них ожидает операции ввода-вывода.

Часто задаваемые вопросы

Урок «Корутины и цикл событий» бесплатный?

Да — полный текст урока «Корутины и цикл событий» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Корутины и цикл событий»?

Определяйте корутины с помощью async def и запускайте их с asyncio.run(). Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Корутины и цикл событий»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Корутины и цикл событий
  2. await, задачи и объединение результатов
  3. Асинхронные менеджеры контекста и итераторы
  4. Шаблоны асинхронного ввода-вывода в продуктивной среде
← Назад к Python Academy