Sobes.tech
Back to questions
Middle+
4

Как устроены параллельные вычисления в Go? Расскажи про планировщик горутин

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

В Go параллельные вычисления реализованы через горутины — легковесные потоки, управляемые рантаймом Go. Планировщик горутин (scheduler) отвечает за распределение множества горутин на ограниченное число системных потоков (OS threads).

Планировщик устроен по модели M:N, где M — количество системных потоков, N — количество горутин. Основные компоненты:

  • G (goroutine) — структура, описывающая горутину.
  • M (machine) — системный поток, который выполняет горутины.
  • P (processor) — логический процессор, который связывает M и G, управляет очередью готовых горутин.

Работа планировщика:

  • Есть пул P, обычно равный числу доступных CPU (GOMAXPROCS).
  • Каждый P имеет очередь готовых горутин.
  • M привязывается к P и выполняет горутину из его очереди.
  • Если горутина блокируется (например, на ввод/вывод), M может переключиться на другую горутину.

Планировщик позволяет эффективно использовать многопроцессорность, быстро переключаться между горутинами и минимизировать накладные расходы по сравнению с системными потоками.

Пример запуска горутины:

func worker(id int) {
    fmt.Printf("Worker %d started\n", id)
    // работа
}

func main() {
    for i := 0; i < 5; i++ {
        go worker(i) // запуск горутины
    }
    time.Sleep(time.Second) // ждем завершения
}