Sobes.tech
Junior — Middle

Ako sa vykonáva zmena medzi rôznymi gorutinami v jazyku Go?

sobes.tech AI

Odpoveď od AI

V jazyku Go sa zmena vykonávania medzi gorutinami vykonáva plánovač runtime Go, ktorý implementuje model M:N — množinu gorutín (M), ktoré sú plánované na množinu systémových vlákien (N).

Plánovač Go funguje kooperatívne a preemptívne:

  • Gorutina môže explicitne odovzdať kontrolu volaním runtime.Gosched(), čo umožňuje iným gorutinám vykonávať sa.
  • Plánovač môže prerušiť gorutinu na určitých bodoch (napríklad pri volaní blokujúcich operácií, systémových volaniach, operáciách vstupu/výstupu).
  • Runtime Go automaticky prepína kontext medzi gorutinami a uchováva ich stav (zásobník, registre).

Týmto spôsobom prechody medzi gorutinami prebiehajú vo vnútri runtime Go, a programátor to zvyčajne priamo neovláda.

Príklad explicitného odovzdania kontroly:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // prechádzame na iné gorutiny
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("Hlavná gorutina -", i)
    }
}

Tu runtime.Gosched() umožňuje prechod na iné gorutiny.