Ответ
Этот подход называется event loop или event-driven architecture. Вместо планировщика задачи обрабатываются в цикле событий, где каждое событие (например, ввод-вывод, таймеры) запускает соответствующую функцию-обработчик.
Пример на Go (хотя он редко использует event loop из-за горутин):
for {
select {
case msg := <-messages:
handleMessage(msg)
case <-timer.C:
handleTimeout()
}
}
Плюсы: низкие накладные расходы, предсказуемость.
Минусы: блокирующие задачи могут заморозить весь цикл.