Junior — Middle
Kā tiek veikta izpildes maiņa starp dažādām goroutines Go valodā?
sobes.tech AI
Atbilde no AI
Go valodā izpildes pārslēgšana starp gorutīnām tiek veikta ar Go runtime plānotāju, kas īsteno M:N modeli — gorutīnu (M), kas tiek plānotas uz sistēmas pavedieniem (N).
Go plānotājs darbojas kooperatīvi un preemptīvi:
- Gorutīna var tieši nodot kontroli, izsaucot
runtime.Gosched(), kas ļauj izpildīt citām gorutīnām. - Plānotājs var pārtraukt gorutīnu noteiktos punktos (piemēram, bloķējošās operācijās, sistēmas izsaukumos, ievades/izvades operācijās).
- Go runtime automātiski maina kontekstu starp gorutīnām, saglabājot to stāvokli (koka, reģistrus).
Tādējādi, starp gorutīnām notiek pārslēgšanās iekšā Go runtime, un programmētājs parasti to tieši nevada.
Piemērs ar tiešu kontroli:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // pārslēdz uz citām gorutīnām
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Galvenā gorutina -", i)
}
}
Šeit runtime.Gosched() ļauj pārslēgties uz citām gorutīnām.