Реализация цикла событий на основе генераторов (event-loop) код Дэвида Бизли. Код является модификацией кода Дэвида Бизли & Яндекс Практикума.
Task– представляет собой задачу, оборачивает корутину (функцию-генератор) и управляет её выполнением.Scheduler– планировщик задач, управляет их выполнением и обработкой событий ввода-вывода.AsyncSocket– обертка надsocket, позволяющая использовать его асинхронно.SystemCall– базовый класс для системных вызовов (например,NewTask,WriteWait,ReadWait).NewTask– создаёт новую задачу в планировщике.WriteWait/ReadWait– позволяют приостановить выполнение задачи до готовности сокета к записи/чтению.
- Запуск сервера (
server)- Запускает
socketи ожидает подключения клиентов. - При подключении клиента создает новую задачу
handle_client(client, address).
- Запускает
- Обработка клиента (
handle_client)- Читает данные из сокета (
recv). - Если данные есть, отправляет их обратно (
send). - Если данных нет – закрывает соединение.
- Читает данные из сокета (
- Планировщик (
Scheduler)- Умеет:
- Добавлять задачи (
add_task). - Ожидать событий ввода-вывода (
wait_for_read,wait_for_write). - Выполнять задачи (
_run_once). - Работать с
selectors(следить за готовностью сокетов). - Запускает бесконечный цикл обработки задач (
event_loop).
- Запускается
event_loop()→ добавляется серверserver(). - Сервер слушает сокет и ждет подключения клиентов (
accept). - При подключении создается
handle_client(). - Читаем и отправляем данные асинхронно (
recv/send). - Если данных нет → закрываем соединение.