Sobes.tech
Junior — Middle

Cum este implementat modelul de lucru cu concurența și sincronizarea în limbajul Go?

sobes.tech AI

Răspuns de la AI

În limbajul Go, concurența este implementată prin fire ușoare numite goroutines. Goroutines sunt inițiate cu cuvântul cheie go și rulează în paralel, în timp ce runtime-ul Go gestionează singur planificarea lor.

Pentru sincronizare și schimb de date între goroutines, se folosesc mai multe mecanisme:

  • Canale (channels) — permit transmiterea sigură a datelor între goroutines, asigurând sincronizarea. Canalele pot fi considerate cozi care blochează expeditorul dacă sunt pline și receptorul dacă sunt goale.

  • Pachetul sync — conține primitive de sincronizare precum mutex-uri (sync.Mutex), variabile condiționale (sync.Cond), grupuri de așteptare (sync.WaitGroup) și altele.

Exemplu de utilizare a goroutines și canalelor:

package main
import (
    "fmt"
    "time"
)

func worker(id int, ch chan string) {
    time.Sleep(time.Second)
    ch <- fmt.Sprintf("Lucrător %d terminat", 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)
    }
}

Aici, trei goroutines rulează în paralel, iar canalul este folosit pentru a primi rezultatele de la fiecare dintre ele.