Sobes.tech
Junior — Middle

É possível que um agendador não force uma goroutine a ceder a execução?

sobes.tech IA

Resposta da IA

Em Go, o agendador de goroutines (scheduler) normalmente gere a troca entre goroutines para garantir a execução concorrente. No entanto, pode ocorrer que uma goroutine não ceda a execução se realizar uma operação síncrona prolongada sem chamar funções que possam provocar uma troca de agendador (por exemplo, chamadas ao sistema, operações de entrada/saída ou chamada a runtime.Gosched()).

Isto deve-se ao facto de o Go usar multitarefa cooperativa ao nível de goroutines: a troca ocorre em pontos específicos, como chamadas a operações bloqueantes ou runtime.Gosched(). Se uma goroutine executar um ciclo infinito sem esses pontos, ela pode «bloquear» o agendador, sem ceder o controlo a outras goroutines.

Exemplo:

for {
    // se aqui não houver chamadas que possam ceder ao agendador,
    // a goroutine pode não ceder a execução a outras
}

Por isso, recomenda-se inserir chamadas a runtime.Gosched() ou usar canais/operações bloqueantes para permitir que o agendador alterne entre as goroutines.