Python
YeahNotSewerSidePython.
Ну а теперь напишем это все на питоне)
Сразу приложу ссылку на весь код: github
Код использует генераторы и итераторы на питоне, про них можно почитать отдельно, я на них зацикливаться не буду, они нужны лишь для простоты кода, потому что они сохраняют контекст функции.
Итак. Начнем с файла Task.py, здесь у нас будет храниться класс Task, который представляет собой корутину/итератор. Он принимает и сохраняет в себе функцию/генератор, которую он вызвает при вызове функции __next__.
Future. Фьючер это специальная структура, которая говорит основному исполнителю состояние корутины.
Continue - Корутина хотела бы продолжить выполнение, но позже, сейчас она может подождать/пропустить другие корутины вперед.
Await - Корутина хотела бы прервать выполнение и делигировать его дочерней корутине, по завершении которой, она будет готова продолжать выполнение.
AwaitReturn - То же самое, что и Await, но корутина планирует получить значение, которое вернет дочерняя корутина по завешениии.
Result - Корутина закончила выполнение и вернула какое-то значение.
Future возвращается корутиной после вызова ее через next.
Cycle.py
В этом файле хранится имплементация основного цикла, в котором выполняются корутины.
__running_queue - это queue, в которой хранятся корутины, готовые прожолжить выполнение.
__awaiting - в этом поле мы храним корутины которые вернули Await/AwaitReturn, т.е. они не выполняются, а ждут, когда дочерняя корутина закончит выполнение.
__futures_results - здесь сохраняются Result от корутин, значения, которые вернли функции по их завершении.
__last_task_id - все таски имеют свой ид, для каждой новой таски мы увеличиваем ид на 1.
В файле __init__.py можно посмотреть пример использования.