Ответ
Go продвигает философию CSP (Communicating Sequential Processes), где основной принцип — «не обменивайтесь данными через общую память, а делитесь памятью через обмен данными». Это достигается с помощью горутин и каналов. Основные паттерны:
-
Worker Pool (Пул воркеров)
- Описание: Создается фиксированное количество горутин-воркеров для обработки задач из общего канала. Это позволяет контролировать уровень параллелизма и избежать создания неограниченного числа горутин.
- Пример:
jobs := make(chan int, 100) results := make(chan int, 100)
// Запуск 3 воркеров for w := 1; w <= 3; w++ { go worker(w, jobs, results) }
-
Fan-out / Fan-in
- Описание: Один производитель данных распределяет (fan-out) работу между несколькими горутинами-обработчиками. Затем результаты от всех обработчиков собираются (fan-in) в один канал.
-
Pipeline (Конвейер)
- Описание: Цепочка этапов обработки, где каждый этап — это горутина, принимающая данные из входящего канала и отправляющая результат в исходящий. Позволяет эффективно распараллеливать последовательные задачи.
- Пример этапа:
func square(in <-chan int) <-chan int { out := make(chan int) go func() { defer close(out) for n := range in { out <- n * n } }() return out }
-
Generator (Генератор)
- Описание: Функция, которая запускает горутину и возвращает канал. Горутина генерирует данные и отправляет их в этот канал, скрывая детали реализации от потребителя.
-
Context для отмены и таймаутов
- Описание: Использование пакета
context
для передачи сигналов отмены, дедлайнов и таймаутов вниз по стеку вызовов в другие горутины. Ключевой паттерн для graceful shutdown.
- Описание: Использование пакета
-
Mutex / RWMutex для защиты общих данных
- Описание: Классический паттерн для защиты разделяемой памяти от гонок данных (race conditions), когда использование каналов нецелесообразно.
sync.Mutex
для эксклюзивного доступа,sync.RWMutex
для ситуаций с частыми чтениями и редкими записями.
- Описание: Классический паттерн для защиты разделяемой памяти от гонок данных (race conditions), когда использование каналов нецелесообразно.