Sobes.tech
Junior — Middle

Jak se provádí změna provádění mezi různými gorutinami v jazyce Go?

sobes.tech AI

Odpověď od AI

V jazyce Go je přepínání mezi gorutinami prováděno plánovačem runtime Go, který implementuje model M:N — množinu gorutin (M), které jsou plánovány na množinu systémových vláken (N).

Plánovač Go funguje kooperativně a předběžně:

  • Gorutina může explicitně předat řízení voláním runtime.Gosched(), což umožňuje jiným gorutinám běžet.
  • Plánovač může přerušit gorutinu v určitých bodech (například při volání blokujících operací, systémových volání, operacích vstupu/výstupu).
  • Runtime Go automaticky přepíná kontext mezi gorutinami a ukládá jejich stav (zásobník, registry).

Tímto způsobem přepínání mezi gorutinami probíhá uvnitř runtime Go, a programátor to obvykle přímo neřídí.

Příklad explicitního předání řízení:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // předává řízení jiným gorutinám
    }
}

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

Zde runtime.Gosched() umožňuje přepnout na jiné gorutiny.