Конкурентность Go

О теме

Горутины, каналы, context, sync, гонки.

Лекции

Конкурентность Go
Data race и memory model

Data race — две горутины трогают одну переменную, среди доступов есть запись, и нет договорённости «кто раньше». Это баг, а не «на моей машине работает».

Конкурентность Go
WaitGroup, Once, атомики

WaitGroup ждёт набор горутин. Once гарантирует один вызов функции. atomic закрывает простые счётчики. Составное условие из нескольких полей атомиком не защитить.

Конкурентность Go
Mutex, RWMutex и каналы как синхронизация

Mutex защищает общую память. Канал передаёт владение значением между горутинами. RWMutex выгоден, когда чтений много, а запись редкая.

Конкурентность Go
Context: cancel, deadline, values

Context несёт отмену и дедлайн вниз по вызовам. Values годятся для редких полей запроса вроде trace id, а не для логгера, конфига и внедрения зависимостей.

Конкурентность Go
Select, таймаут и default

select ждёт, пока будет готов хотя бы один case, и среди готовых выбирает случайный. default — попытка без ожидания. Таймаут делают через timer или context, не через бесконечный sleep.

Конкурентность Go
Каналы: буфер, close, владение

Канал передаёт значения и синхронизирует горутины. Закрывает тот, кто пишет. Send в закрытый канал — panic. Receive из закрытого — нуль типа и ok=false.

Конкурентность Go
Горутины и планировщик GMP

Горутина — дешёвая единица работы со своим стеком, не поток ОС. Планировщик связывает G (горутина), M (поток) и P (очередь исполнения).