Делаем свой asyncio на основе Python генераторов (Чтобы понять как устроены asyncio и корутины)
Если вы когда нибудь использовали asyncio, то скорее всего слышали что корутины(coroutine), которые являются основой asyncio, сделаны на основе Python генераторов(generator). Но не всем сразу понятно как именно это сделано.
Мы знаем что генераторы в Python - это функции с ключевым словом yield внутри. И они работают как обычные итераторы. Генераторы не возвращают все значения сразу, а работают "лениво" (lazy), возвращая следующее значение только когда нужно, т.е. когда итерация доходит до следующего элемента. А до этого момента генератор стоит на месте и ждет, пока в этот момент работает другой код. Получается, когда мы используем генераторы, у нас есть несколько потоков выполнения?
Давайте в этом вместе разбираться. Попробуем использовать генераторы в вместо async функций в asyncio.