Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: goroutine, scheduler, concurrency, GOMAXPROCS, M:N scheduling

Как управляется переключение между горутинами в Go?

Вопрос проверяет понимание модели конкурентности в Go, основанной на горутинах и планировщике, что необходимо для написания эффективных конкурентных программ.

Короткий ответ

Переключение между горутинами управляется планировщиком Go (Go scheduler), который работает по принципу кооперативной многозадачности. Планировщик использует модель M:N, где M горутин отображаются на N потоков ОС. Переключение происходит в точках вызова, таких как операции ввода-вывода, каналы, time.Sleep или явный вызов runtime.Gosched().

Длинный ответ

Как работает планировщик горутин в Go

В Go горутины — это легковесные потоки, которые управляются не операционной системой, а собственным планировщиком языка. Планировщик Go реализует модель M:N, где M горутин выполняются на N потоков ОС. Это позволяет эффективно использовать ресурсы и создавать тысячи горутин без значительных накладных расходов.

Точки переключения

Переключение между горутинами происходит кооперативно, то есть горутина сама уступает выполнение в определенных точках:

  • Операции с каналами (отправка/получение)
  • Системные вызовы (ввод-вывод)
  • time.Sleep()
  • Вызов runtime.Gosched()
  • Блокировки (sync.Mutex)

Пример кода

package main

import (
	"fmt"
	"runtime"
	"time"
)

func worker(id int) {
	for i := 0; i < 3; i++ {
		fmt.Printf("Worker %d: iteration %d\n", id, i)
		runtime.Gosched() // явно уступаем выполнение
	}
}

func main() {
	go worker(1)
	go worker(2)
	time.Sleep(time.Second)
	fmt.Println("Main done")
}

В этом примере горутины переключаются при вызове runtime.Gosched(), что позволяет планировщику распределить время между ними.

Вывод

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#goroutine

#scheduler

#concurrency

#GOMAXPROCS

#M:N scheduling

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.