Sobes.tech
Junior — Middle

Como é que o escalonador do sistema operativo gere a execução de uma função que faz uma solicitação de rede?

sobes.tech IA

Resposta da IA

No Go, o agendador (scheduler) gere as goroutines, que são threads leves. Quando uma função faz uma requisição de rede, ela geralmente fica bloqueada numa operação de entrada/saída.

O agendador do Go usa entrada/saída não bloqueante e chamadas ao sistema assíncronas. Quando uma goroutine espera por uma resposta da rede, o agendador a coloca em estado de espera e troca para executar outras goroutines.

Isso permite usar eficientemente os recursos do sistema e não bloquear a thread do sistema operativo. Após a requisição de rede terminar, o agendador retoma a execução da goroutine.

Exemplo:

func fetch(url string) {
    resp, err := http.Get(url) // requisição de rede
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    // processamento da resposta
}

func main() {
    go fetch("http://example.com")
    // outras goroutines são executadas em paralelo
}

Desta forma, o agendador do Go gere eficientemente as goroutines, trocando-as durante operações bloqueantes, como requisições de rede.