Ответ
В Go многопоточность реализуется через горутины и каналы. Основные паттерны:
- Worker Pool – пул горутин для параллельной обработки задач:
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
-
Fan-out/Fan-in – распределение задач между воркерами (fan-out) и сбор результатов (fan-in).
-
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
}
-
Pub/Sub – широковещательная рассылка через каналы или
sync.Cond. -
Mutex/RWMutex – для защиты общих данных в конкурентных операциях.
-
Context – отмена горутин через контекст (
ctx.Done()).
Go поощряет CSP (Communicating Sequential Processes) – обмен данными через каналы, а не разделение памяти.