Worker pool, fan-in/out
Тема дорожной карты · Golang
Паттерны проектирования Go — идиоматичные решения повторяющихся архитектурных задач в Golang, сформированные акцентом языка на композицию вместо наследования, интерфейсы, goroutines и каналы. Паттерн worker pool использует фиксированное число goroutines, читающих из буферизованного канала tasks := make(chan Job, n) при координации через sync.WaitGroup, обеспечивая контролируемый параллелизм без неограниченного создания goroutines. Паттерны fan-out/fan-in в Go распределяют работу по нескольким goroutines через запуски go func() и собирают результаты в общий канал results, а оператор select с веткой ctx.Done() обеспечивает чистую отмену через context.Context. Паттерн functional options (type Option func(*Config)) — идиоматичный Go-паттерн для построения сложных объектов вроде gRPC-серверов или HTTP-цепочек middleware без телескопических конструкторов. Другие важные паттерны Go включают конвейерный паттерн для потоковых преобразований данных, sync.Once-синглтон для одноразовой инициализации и errgroup.Group из golang.org/x/sync для управления fan-out goroutines, все из которых должны успешно завершиться перед продолжением.
Как это работает
Worker pool, fan-in/out построен на 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, первая ошибка пробрасывается".
Типичные ошибки
Ловушки Worker pool, fan-in/out: утечки goroutines (goroutine ждёт навеки на канале, в который никто не пишет); data race на shared map без mutex (race detector ловит: go test -race); deadlock (go test -race НЕ ловит deadlock — осторожно); не пробрасывают context.Context, и cancellation не доходит до глубокого вызова.