Что такое корутины в Python

Ответ

Корутина (coroutine) в Python — это специальная функция, выполнение которой можно приостановить и возобновить. Она является основой для асинхронного программирования с использованием asyncio.

Основные характеристики:

  • Объявление: Создается с помощью ключевых слов async def.
  • Приостановка: Использует await для приостановки своего выполнения и передачи управления обратно в цикл событий (event loop), пока ожидается результат другой корутины (например, asyncio.sleep() или сетевой запрос).
  • Возвращаемый объект: При вызове async def функция не выполняется немедленно, а возвращает объект корутины, который необходимо запланировать для выполнения в event loop.

Как это работает:

Когда корутина встречает await, она говорит циклу событий: "Я жду завершения этой операции, а пока можешь запустить другую задачу". Это позволяет эффективно использовать время ожидания I/O операций, не блокируя весь поток.

Пример:

import asyncio

async def say_hello():
    print("Начало... ")
    # 1. Приостанавливаем say_hello и передаем управление event loop
    #    на 1 секунду. В это время могут выполняться другие задачи.
    await asyncio.sleep(1)
    # 2. Event loop возобновляет выполнение say_hello с этого места.
    print("...конец!")

# Создаем объект корутины
coro = say_hello()

# Запускаем корутину в цикле событий asyncio
asyncio.run(coro)

Ответ 18+ 🔞

Давай разберём эту вашу корутину, а то звучит как болезнь какая-то, блядь. Представь, что у тебя есть функция, но она не тупая, как обычно, а хитрая жопа. Она может сказать: "А знаешь что? Я тут подожду, а ты пока другие дела делай". Вот это и есть корутина, ёпта.

Что это за зверь такой:

  • Как объявить: Пишешь не просто def, а async def. Сразу видно, что функция не простая, а с прибамбасами.
  • Как тормозить: Внутри неё есть волшебное слово await. Как только она его видит — всё, стоп машина. Она говорит циклу событий: "Бля, я тут зависла, жду ответа от интернета или просто сплю. Не стой столбом, иди другие функции погоняй, пока я отдыхаю".
  • Что возвращает: Когда ты её просто вызываешь, она нихуя не делает сразу. Возвращает тебе какой-то объект-обещание, типа "я потом всё сделаю, чувак". Чтобы она реально побежала, её надо в специальный менеджер-планировщик (этот самый event loop) затолкать.

Суть в чём, блядь?

Вся соль в том, чтобы не проёбывать время впустую. Обычная программа, встретив операцию вроде "поспать секунду" или "скачать файл с интернета", будет тупо ждать, как мудак, уставившись в потолок. А корутина на этом месте скидывает с себя ответственность, и планировщик запускает делать что-то полезное другие корутины. Красота, ёперный театр!

Смотри, как это выглядит на практике:

import asyncio

async def say_hello():
    print("Начало... ")
    # 1. Тут наша хитрая жопа говорит: "А я посплю секунду, браток. Иди другие дела крути".
    await asyncio.sleep(1)
    # 2. Через секунду планировщик её будит: "Так, проснись, мудак, продолжай работать!".
    print("...конец!")

# Просто вызвать — нихуя не произойдет, вернется какой-то объект.
coro = say_hello()

# А вот так — запустим её в дело через главный планировщик asyncio.
asyncio.run(coro)

Вот и вся магия. Не блокирующая, а выжидающая функция. Удобная штука, если правильно пользоваться, а не ебашить её как попало.