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