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) // ждем завершения
}