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