Корутины и цикл событий
Определяйте корутины с помощью 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 — локальная установка не требуется.
Все уроки этого курса
- Корутины и цикл событий
- await, задачи и объединение результатов
- Асинхронные менеджеры контекста и итераторы
- Шаблоны асинхронного ввода-вывода в продуктивной среде