Sobes.tech
Junior — Middle

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

sobes.tech AI

Отговор от AI

В езика Go, смяната на изпълнението между горутините се извършва от планировчика на Go runtime, който реализира модел M:N — множество горутини (M), които се планират върху множество системни нишки (N).

Планировчикът на Go работи кооперативно и предварително:

  • Горутината може явно да предаде управлението, като извика runtime.Gosched(), което позволява на други горутини да се изпълняват.
  • Планировчикът може да прекъсне горутина в определени точки (например при извикване на блокиращи операции, системни извиквания, операции за вход/изход).
  • Go runtime автоматично превключва контекста между горутините, запазвайки тяхното състояние (стек, регистри).

По този начин, превключването между горутините се случва вътре в Go runtime, и програмистът обикновено не го контролира директно.

Пример за явно предаване на управлението:

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("Главна горутина -", i)
    }
}

Тук runtime.Gosched() позволява превключване към други горутини.