Back to questions
Junior — Middle
81
Каким образом осуществляется смена выполнения между разными горутинами в языке Go?
Companies where asked
Lamoda Tech
EMCD
Answer from AI
sobes.tech AI
В языке Go смена выполнения между горутинами (goroutines) осуществляется планировщиком Go runtime, который реализует модель M:N — множество горутин (M) планируется на множество системных потоков (N).
Планировщик Go работает кооперативно и прерываемо:
- Горутинa может уступить управление явно, вызвав
runtime.Gosched(), что позволяет другим горутинам выполняться. - Планировщик может прервать горутину в определённых точках (например, при вызове блокирующих операций, системных вызовов, операций ввода-вывода).
- Go runtime автоматически переключает контекст между горутинами, сохраняя их состояние (стек, регистры).
Таким образом, переключение между горутинами происходит внутри рантайма Go, и программист обычно не управляет этим напрямую.
Пример явного уступления управления:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // уступаем выполнение другим горутинам
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Main goroutine -", i)
}
}
Здесь runtime.Gosched() позволяет переключиться на другие горутины.