Какие паттерны конкурентной работы (concurrency) в Go вы знаете?

Ответ

Go продвигает философию CSP (Communicating Sequential Processes), где основной принцип — «не обменивайтесь данными через общую память, а делитесь памятью через обмен данными». Это достигается с помощью горутин и каналов. Основные паттерны:

  1. Worker Pool (Пул воркеров)

    • Описание: Создается фиксированное количество горутин-воркеров для обработки задач из общего канала. Это позволяет контролировать уровень параллелизма и избежать создания неограниченного числа горутин.
    • Пример:
      
      jobs := make(chan int, 100)
      results := make(chan int, 100)

    // Запуск 3 воркеров for w := 1; w <= 3; w++ { go worker(w, jobs, results) }

  2. Fan-out / Fan-in

    • Описание: Один производитель данных распределяет (fan-out) работу между несколькими горутинами-обработчиками. Затем результаты от всех обработчиков собираются (fan-in) в один канал.
  3. 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
      }
  4. Generator (Генератор)

    • Описание: Функция, которая запускает горутину и возвращает канал. Горутина генерирует данные и отправляет их в этот канал, скрывая детали реализации от потребителя.
  5. Context для отмены и таймаутов

    • Описание: Использование пакета context для передачи сигналов отмены, дедлайнов и таймаутов вниз по стеку вызовов в другие горутины. Ключевой паттерн для graceful shutdown.
  6. Mutex / RWMutex для защиты общих данных

    • Описание: Классический паттерн для защиты разделяемой памяти от гонок данных (race conditions), когда использование каналов нецелесообразно. sync.Mutex для эксклюзивного доступа, sync.RWMutex для ситуаций с частыми чтениями и редкими записями.