Реализация цикла событий на основе генераторов (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
). - Если данных нет → закрываем соединение.