Выбор ответа Middle Горутины и планировщик GMP обновлено

Сетевой ввод-вывод и горутины

Вопрос

Почему тысячи горутин, ждущих ответа по сети, не занимают тысячи потоков ОС?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Неблокирующие сокеты: горутина паркуется, netpoller её будит. net в Go построен на неблокирующих сокетах.

Варианты ответа

  1. Неблокирующие сокеты: горутина паркуется, netpoller её будитправильный ответ
  2. Каждая горутина получает свой поток, но потоки Go очень лёгкие
  3. Сетевые вызовы выполняются в отдельном вспомогательном процессе
  4. Рантайм опрашивает все сокеты в цикле каждые 10 мс

Разбор

net в Go построен на неблокирующих сокетах. Когда данных нет, горутина паркуется, а дескриптор регистрируется в epoll (Linux), kqueue (BSD, macOS) или IOCP (Windows). Планировщик проверяет готовые дескрипторы, когда ищет работу, и возвращает горутины в очередь. Потоков на горутину нет, процессов тоже, и активного опроса раз в N мс нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.