Sobes.tech
Junior — Middle

Kako se vrši promena izvršavanja između različitih gorutina u jeziku Go?

sobes.tech АИ

Одговор од АИ

U jeziku Go, promena izvršavanja između gorutina vrši se od strane planera Go runtime-a, koji implementira model M:N — skup gorutina (M) koji se planira na skup sistemskih niti (N).

Planer Go radi kooperativno i preemptivno:

  • Gorutina može eksplicitno da preda kontrolu pozivom runtime.Gosched(), što omogućava drugim gorutinama da se izvršavaju.
  • Planer može prekinuti gorutinu u određenim tačkama (npr. pri pozivima blokirajućih operacija, sistemskih pozivima, operacijama ulaza/izlaza).
  • Runtime Go automatski menja kontekst između gorutina, čuvajući njihovo stanje (stog, registre).

Na ovaj način, prebacivanje između gorutina dešava se unutar runtime-a Go, i programer obično ne kontroliše to direktno.

Primer eksplicitnog prepuštanja kontrole:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // prepuštamo izvršenje drugim gorutinama
    }
}

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

Ovde, runtime.Gosched() omogućava prebacivanje na druge gorutine.