Junior — Middle
Come avviene il cambio di esecuzione tra diverse goroutine nel linguaggio Go?
sobes.tech AI
Risposta dell'AI
Nel linguaggio Go, il cambio di esecuzione tra goroutine viene gestito dal scheduler del runtime Go, che implementa il modello M:N — un insieme di goroutine (M) pianificate su un insieme di thread di sistema (N).
Lo scheduler di Go funziona in modo cooperativo e preemptivo:
- Una goroutine può cedere esplicitamente il controllo chiamando
runtime.Gosched(), consentendo ad altre goroutine di essere eseguite. - Lo scheduler può interrompere una goroutine in punti specifici (ad esempio, durante chiamate bloccanti, chiamate di sistema, operazioni di input/output).
- Il runtime di Go cambia automaticamente il contesto tra le goroutine, salvando il loro stato (stack, registri).
In questo modo, il cambio tra goroutine avviene all’interno del runtime di Go, e il programmatore di solito non lo controlla direttamente.
Esempio di cessione esplicita del controllo:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // cediamo l’esecuzione ad altre goroutine
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Goroutine principale -", i)
}
}
Qui, runtime.Gosched() permette di passare ad altre goroutine.