Sobes.tech
Junior — Middle

Kaip Go kalboje įgyvendintas konkurencingumo ir sinchronizacijos modelis?

sobes.tech AI

Atsakymas iš AI

Go kalboje konkurencingumas įgyvendinamas per lengvus srautus — goroutines. Goroutines pradedamos naudojant raktinį žodį go ir veikia lygiagrečiai, o Go vykdymo laikas pats valdo jų planavimą.

Sąveikai ir duomenų mainams tarp goroutines naudojami keli mechanizmai:

  • Kanalai (channels) — leidžia saugiai perduoti duomenis tarp goroutines ir užtikrina sinchronizaciją. Kanalus galima laikyti eilėmis, kurios blokuoja siuntėją, jei jos pilnos, ir gavėją, jei jos tuščios.

  • sync paketas — apima sinchronizacijos primitivius, tokius kaip mutexai (sync.Mutex), sąlygines kintamąsias (sync.Cond), laukiančias grupes (sync.WaitGroup) ir kt.

Goroutine ir kanalų naudojimo pavyzdys:

package main
import (
    "fmt"
    "time"
)

func worker(id int, ch chan string) {
    time.Sleep(time.Second)
    ch <- fmt.Sprintf("Darbininkas %d baigė", id)
}

func main() {
    ch := make(chan string)
    for i := 1; i <= 3; i++ {
        go worker(i, ch)
    }
    for i := 1; i <= 3; i++ {
        msg := <-ch
        fmt.Println(msg)
    }
}

Čia trys goroutine veikia lygiagrečiai, o kanalas naudojamas rezultatams gauti iš kiekvienos iš jų.