Junior — Middle
Como é que a mudança de execução entre diferentes goroutines é realizada na linguagem Go?
sobes.tech IA
Resposta da IA
Na linguagem Go, a mudança de execução entre goroutines é realizada pelo agendador do runtime Go, que implementa o modelo M:N — um conjunto de goroutines (M) agendadas em um conjunto de threads do sistema (N).
O agendador do Go funciona de forma cooperativa e preemptiva:
- Uma goroutine pode ceder explicitamente o controlo chamando
runtime.Gosched(), permitindo que outras goroutines sejam executadas. - O agendador pode interromper uma goroutine em pontos específicos (por exemplo, ao chamar operações bloqueantes, chamadas ao sistema, operações de entrada/saída).
- O runtime do Go troca automaticamente o contexto entre as goroutines, guardando seu estado (pilha, registos).
Assim, a mudança entre goroutines ocorre dentro do runtime do Go, e o programador geralmente não controla isso diretamente.
Exemplo de cedência explícita de controlo:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // cedemos a execução a outras goroutines
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Goroutine principal -", i)
}
}
Aqui, runtime.Gosched() permite passar a execução para outras goroutines.