Sobes.tech
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.