В чем разница горутин и потоков в Go
Что проверяют
Понимаете ли вы, что горутина планируется рантаймом, а не ядром, и знаете ли следствия по цене.
Как отвечать
Поток это сущность операционной системы: у него фиксированный стек в несколько мегабайт, его создание и переключение требуют участия ядра. Горутина это функция, выполнение которой планирует рантайм Go в пользовательском пространстве.
Отсюда все различия:
- стек: горутина стартует примерно с 2 КБ и растёт по мере надобности копированием на больший участок. Поток получает от 1 до 8 МБ сразу. Поэтому миллион горутин это нормально, а миллион потоков невозможен;
- создание: горутина стоит микросекунды и десятки байт, поток на порядки дороже;
- переключение: между горутинами не требуется системный вызов и переключение контекста ядра, сохраняется лишь несколько регистров;
- кто планирует: горутины планирует рантайм, потоки ядро.
Модель называют M:N: множество горутин выполняется на меньшем числе потоков. В планировщике три сущности: горутины, потоки ядра и логические процессоры, число которых задаётся GOMAXPROCS и по умолчанию равно числу ядер. У каждого логического процессора своя очередь готовых горутин, а при её опустошении он забирает работу у соседей.
Две детали, которые отличают глубокий ответ:
- при блокирующем системном вызове (чтение файла, обращение к сети через C) рантайм отцепляет логический процессор от занятого потока и отдаёт другому, поэтому одна заблокированная горутина не останавливает остальные;
- вытеснение асинхронное: раньше горутина, крутящаяся в цикле без вызовов функций, могла занять процессор навсегда, теперь рантайм прерывает её сигналом.
Практический вывод: горутины дёшевы, и запускать их на каждую задачу нормально. Но дёшево не значит бесплатно: горутина, ожидающая канал, которого никто не закроет, живёт вечно, и такие утечки видны только в профиле.
Где спотыкаются
Считают горутину обёрткой над потоком.
Думают, что GOMAXPROCS ограничивает число горутин.
Полагают, что блокирующий вызов останавливает всю программу.
Запускают горутины без контроля завершения и получают утечку.