É 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.