Какие знаешь паттерны многопоточности

«Какие знаешь паттерны многопоточности» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go многопоточность реализуется через горутины и каналы. Основные паттерны:

  1. Worker Pool – пул горутин для параллельной обработки задач:
jobs := make(chan int, 100)
results := make(chan int, 100)

for w := 1; w <= 3; w++ {
    go worker(w, jobs, results)
}
  1. Fan-out/Fan-in – распределение задач между воркерами (fan-out) и сбор результатов (fan-in).

  2. Pipeline – цепочка обработки данных через каналы:

func stage(in <-chan int) <-chan int {
    out := make(chan int)
    go func() { defer close(out); for n := range in { out <- n * 2 } }()
    return out
}
  1. Pub/Sub – широковещательная рассылка через каналы или sync.Cond.

  2. Mutex/RWMutex – для защиты общих данных в конкурентных операциях.

  3. Context – отмена горутин через контекст (ctx.Done()).

Go поощряет CSP (Communicating Sequential Processes) – обмен данными через каналы, а не разделение памяти.