sync.Mutex, WaitGroup

Тема дорожной карты · Golang

Пакет sync — набор инструментов стандартной библиотеки Go для синхронизации goroutines и защиты разделяемой памяти, предоставляющий примитивы, к которым обращается каждая конкурентная Golang-программа прежде, чем переходить к каналам. sync.Mutex и sync.RWMutex охраняют критические секции: mu.Lock()/mu.Unlock() для эксклюзивного доступа на запись и mu.RLock()/mu.RUnlock() для конкурентного чтения разделяемых словарей, слайсов или структур. sync.WaitGroup координирует группу goroutines: wg.Add(n) регистрирует n задач, каждая goroutine вызывает wg.Done() по завершении, а wg.Wait() блокирует родителя до окончания всех — стандартный паттерн для fan-out работы в Golang-сервисах. sync.Once гарантирует, что инициализирующая функция выполняется ровно один раз во всех goroutines, — идеально для отложенной загрузки дорогостоящих ресурсов вроде пула соединений pgx или реестра Prometheus. Пакет sync также предоставляет sync.Pool для повторного использования краткосрочных выделений (снижая GC-нагрузку в высоконагруженных HTTP-обработчиках), sync.Map для конкурентного доступа к ключ-значение без явных блокировок и sync.Cond для сигнализации в стиле condition-variable между goroutines.

Как это работает

sync.Mutex, WaitGroup построен на goroutines (лёгкие green threads, мультиплексируемые на OS-потоки Go-runtime) и channels (типизированные каналы для сообщений между goroutines). go funcName() запускает goroutine; ch <- value шлёт; value := <-ch принимает. select ждёт на нескольких каналах; context.Context несёт cancellation + дедлайны через дерево вызовов. sync.Mutex, sync.WaitGroup, sync.Once, атомарные примитивы, errgroup для группировки goroutines.

Когда применять

Goroutines используйте свободно — дёшевы (~2-4KB stack начально, растёт по нужде). Всегда имейте способ остановить goroutine (cancellation context.Context, close канала, deadline) — утёкшие goroutines = тихий рост памяти. Context первым аргументом — в любую функцию с I/O. sync.Mutex — для shared state, когда channels неудобны. errgroup — для "fan out, wait, первая ошибка пробрасывается".

Типичные ошибки

Ловушки sync.Mutex, WaitGroup: утечки goroutines (goroutine ждёт навеки на канале, в который никто не пишет); data race на shared map без mutex (race detector ловит: go test -race); deadlock (go test -race НЕ ловит deadlock — осторожно); не пробрасывают context.Context, и cancellation не доходит до глубокого вызова.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…