Как планировщик обрабатывает функцию, выполняющую сетевой запрос

«Как планировщик обрабатывает функцию, выполняющую сетевой запрос» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Планировщик Go (scheduler) автоматически вытесняет горутины, выполняющие блокирующие операции (как сетевые запросы), передавая управление другим горутинам.

Когда горутина делает блокирующий syscall (например, HTTP-запрос):

  1. Связывает текущий поток (M) с сетевым дескриптором
  2. Планировщик отсоединяет M от процессора (P)
  3. Создает/берет новый M из пула для выполнения других горутин
  4. Когда syscall завершается, M пытается вернуться к своему P или становится в очередь

Пример:

go func() {
    resp, err := http.Get("https://example.com") // Блокирующий вызов
    // Планировщик переключится здесь
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
}()

Это позволяет эффективно использовать ресурсы CPU, пока горутина ожидает ответа сети.