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