Come si può organizzare e gestire la sequenza di esecuzione dei thread?
sobes.tech AI
Risposta dell'AI
In Go, per organizzare e gestire la sequenza di esecuzione delle goroutine, vengono utilizzati diversi meccanismi principali:
-
Canali (channels) — consentono di sincronizzare le goroutine, trasmettendo dati tra di loro. Una goroutine che legge da un canale aspetterà che un'altra goroutine invii dati, garantendo l'ordine.
-
sync.WaitGroup — viene usato per aspettare che un gruppo di goroutine finisca. Permette di attendere che tutte le goroutine avviate completino.
-
Mutex e altre primitive del pacchetto sync — per proteggere risorse condivise e prevenire condizioni di race.
Esempio di utilizzo dei canali per un'esecuzione sequenziale:
package main
import (
"fmt"
)
func worker(id int, done chan bool) {
fmt.Printf("Lavoratore %d avviato\n", id)
// simulazione di lavoro
done <- true // segnale di completamento
}
func main() {
done := make(chan bool)
go worker(1, done)
<-done // aspetta che finisca il worker 1
go worker(2, done)
<-done // aspetta che finisca il worker 2
fmt.Println("Tutti i lavoratori hanno terminato")
}
In questo modo, usando canali e sincronizzazione, si può gestire l'ordine di esecuzione delle goroutine.