Ответ
Этот подход называется Event Loop (цикл событий) или Event-Driven Architecture (событийно-ориентированная архитектура).
Суть подхода:
Вместо того чтобы выделять отдельный поток или процесс на каждую задачу (например, на каждого клиента), все операции обрабатываются в одном цикле. Этот цикл ожидает событий (например, новый сетевой запрос, завершение операции чтения файла, срабатывание таймера) и вызывает соответствующий обработчик. Ключевое требование — все операции должны быть неблокирующими.
Отличие от модели Go:
Важно понимать, что Go не использует Event Loop как основную модель конкурентности. Вместо этого Go использует горутины (goroutines) и планировщик (scheduler), который эффективно распределяет горутины по системным потокам. Модель Go (CSP) является более высокоуровневой.
Однако, конструкция select
позволяет горутине реагировать на несколько событий из разных каналов, что концептуально похоже на ожидание событий в Event Loop:
for {
select {
case msg := <-messages: // Ожидание сообщения
handleMessage(msg)
case <-time.After(1 * time.Second): // Ожидание таймера
handleTimeout()
}
}
Где применяется: Этот паттерн является основой для таких технологий, как Node.js, Nginx, Redis.