Concurrency#

Горутины, каналы, планировщик GMP, примитивы синхронизации и context. Главная тема любого Go-собеседования.

Оглавление#

Статьи идут в порядке чтения: от базы к деталям. Всего 17 статей.

  • Горутины: жизненный цикл, стоимость, стек — Горутина — это функция, которая выполняется параллельно с остальным кодом, но управляет ей не операционная система, а сам рантайм Go.
  • Планировщик GMP — GMP — это схема, по которой Go раскладывает тысячи горутин по нескольким потокам операционной системы.
  • Каналы: устройство hchan — Канал — это потокобезопасная очередь, через которую горутины передают друг другу значения.
  • Буферизованные vs небуферизованные каналы — Небуферизованный канал — это встреча: отправитель ждёт получателя, и передача происходит одновременно.
  • selectselect — это «жду сразу нескольких каналов, сработает тот, который будет готов первым».
  • sync.WaitGroupWaitGroup — счётчик незавершённой работы: перед запуском горутины прибавляем единицу, в конце горутины вычитаем, а Wait() держит вызывающего, пока счётчик…
  • sync.Mutex и sync.RWMutex — Мьютекс — это замок: горутина закрывает его перед работой с общими данными и открывает после, а остальные в это время ждут у двери.
  • sync/atomic — Атомарные операции — способ безопасно менять одну переменную из нескольких горутин, не заводя мьютекс.
  • sync.Oncesync.Once гарантирует, что кусок кода выполнится ровно один раз, сколько бы горутин к нему одновременно ни пришло.
  • sync.Condsync.Cond — способ усыпить горутины до момента, когда общее состояние изменится, и разбудить их разом.
  • sync.Map и sync.Poolsync.Map — конкурентная мапа для двух узких сценариев, sync.Pool — ящик для переиспользования временных объектов.
  • errgroup: группа горутин с ошибкой и отменойerrgroup — это WaitGroup, который умеет возвращать ошибку и останавливать остальных.
  • contextcontext — это конверт, который передают первым аргументом в каждую функцию: внутри лежат сигнал «прекращай работу», крайний срок и пара служебных значений.
  • Канал vs Mutex: когда что выбрать — Правило выбора простое: канал — когда данные передаются от одной горутины другой, мьютекс — когда несколько горутин лезут в одни и те же данные.
  • Паттерны конкурентности — Конкурентный код на Go почти целиком собирается из полудюжины типовых схем — вот они.
  • Утечки горутин, дедлоки, livelock, starvation — Четыре типовые болезни конкурентного кода: дедлок, ливлок, голодание и утечка горутин.
  • Race Detector (гонки данных и -race) — Гонка данных — это когда две горутины обращаются к одной переменной одновременно и хотя бы одна из них пишет.