Sobes.tech
Назад к вопросам
Junior — Middle
82

Каким образом осуществляется смена выполнения между разными горутинами в языке Go?

Компании, где спрашивали
Lamoda Tech
EMCD

Ответ от нейросети

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() позволяет переключиться на другие горутины.