Выбор ответа Middle Горутины и планировщик GMP обновлено
Сетевой ввод-вывод и горутины
Вопрос
Почему тысячи горутин, ждущих ответа по сети, не занимают тысячи потоков ОС?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Неблокирующие сокеты: горутина паркуется, netpoller её будит. net в Go построен на неблокирующих сокетах.
Варианты ответа
- Неблокирующие сокеты: горутина паркуется, netpoller её будитправильный ответ
- Каждая горутина получает свой поток, но потоки Go очень лёгкие
- Сетевые вызовы выполняются в отдельном вспомогательном процессе
- Рантайм опрашивает все сокеты в цикле каждые 10 мс
Разбор
net в Go построен на неблокирующих сокетах. Когда данных нет, горутина паркуется, а дескриптор регистрируется в epoll (Linux), kqueue (BSD, macOS) или IOCP (Windows). Планировщик проверяет готовые дескрипторы, когда ищет работу, и возвращает горутины в очередь. Потоков на горутину нет, процессов тоже, и активного опроса раз в N мс нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.