Sobes.tech
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.