Sobes.tech
Junior — Middle

Come viene implementato il modello di lavoro con concorrenza e sincronizzazione nel linguaggio Go?

sobes.tech AI

Risposta dell'AI

Nel linguaggio Go, la concorrenza è implementata tramite thread leggeri chiamati goroutine. Le goroutine vengono avviate con la parola chiave go e funzionano in parallelo, mentre il runtime di Go gestisce autonomamente la loro pianificazione.

Per la sincronizzazione e lo scambio di dati tra goroutine, vengono utilizzati diversi meccanismi:

  • Canali (channels) — consentono di trasmettere dati in modo sicuro tra goroutine, garantendo la sincronizzazione. I canali possono essere considerati code che bloccano il mittente se pieni e il ricevente se vuoti.

  • Pacchetto sync — contiene primitive di sincronizzazione come mutex (sync.Mutex), variabili condizionali (sync.Cond), gruppi di attesa (sync.WaitGroup) e altri.

Esempio di utilizzo di goroutine e canali:

package main
import (
    "fmt"
    "time"
)

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

Qui, tre goroutine vengono eseguite in parallelo, e il canale viene usato per ricevere i risultati di ciascuna di esse.