Python

Python

YeahNotSewerSide

Python.


Ну а теперь напишем это все на питоне)


Сразу приложу ссылку на весь код: 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 можно посмотреть пример использования.


Report Page