Junior — Middle
Kuidas toimub erinevate goroutine'ide vahetamine Go keeles?
sobes.tech AI
Vastus AI-lt
Keeltes Go keeles toimub goroutine'ide vahel vahetamine Go runtime'i planeerija poolt, mis rakendab M:N mudelit — goroutine'id (M), mis planeeritakse süsteemi niitidele (N).
Go planeerija töötab koostöö- ja eelnevalt katkestava režiimis:
- Üks goroutine võib selgelt üle anda kontrolli, kutsudes välja
runtime.Gosched(), mis võimaldab teistel goroutine'idel täita. - Planeerija võib katkestada goroutine'i teatud punktides (näiteks blokeerivate operatsioonide, süsteemikutsumiste, sisendi/väljundi operatsioonide ajal).
- Go runtime vahetab automaatselt konteksti goroutine'ide vahel, salvestades nende oleku (stakk, registrid).
Seega toimub vahetamine goroutine'ide vahel Go runtime'i sees ning programmeerija tavaliselt seda otse ei kontrolli.
Näide selgest üleandmisest:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // üleandmine teistele goroutine'idele
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Peamine goroutine -", i)
}
}
Siin võimaldab runtime.Gosched() vahetada teiste goroutine'ide vastu.