Sobes.tech
Назад к вопросам
Junior — Middle
64

Каким образом в Python осуществлялась асинхронность до версии 3.6, перед появлением конструкции async def?

Компании, где спрашивали
Т-БанкТ-Банк

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

До async def асинхронность в Python строилась на generator-based coroutines, yield/yield from и событийнoм цикле. На практике чаще использовались библиотеки вроде asyncio, Twisted, gevent, а также колбэки и неблокирующий I/O. То есть асинхронность была возможна, но реализовывалась менее нативно и более многословно, чем после появления async/await.

Определение:

До Python 3.5–3.6 асинхронность в основном делали через генераторы, которые могли приостанавливать выполнение и отдавать управление обратно планировщику. Ключевой механизм — yield и позже yield from, которые позволяли вручную “протягивать” управление между корутинами. Вокруг этого строился event loop, который запускал задачи, ждал I/O и возобновлял выполнение при готовности данных.

Пример использования:

import asyncio

@asyncio.coroutine
def fetch_data():
    print("start")
    result = yield from asyncio.sleep(1)
    print("done")
    return result

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_data())

Пояснение кода:

Код показывает старый стиль корутин в asyncio.

  1. Декоратор @asyncio.coroutine помечает обычную функцию как корутину старого формата.
  2. yield from asyncio.sleep(1) приостанавливает выполнение на время ожидания.
  3. Во время ожидания event loop может выполнять другие задачи.
  4. После завершения ожидания управление возвращается в корутину, и она продолжает работу.
  5. run_until_complete(...) запускает цикл событий и ждёт завершения корутины.

Ключевые моменты:

  • До async def асинхронность строилась на генераторах и yield from.
  • Управление выполнением отдавалось event loop или внешней библиотеке.
  • Часто использовались колбэки и неблокирующий I/O.
  • asyncio до нативного синтаксиса поддерживал корутины через @asyncio.coroutine.
  • Старый подход работал, но был менее читаемым и более сложным, чем async/await.