Вопрос: Как сделать пайплайн (fan-out → fan-in) на каналах?
Python
Middle
Без компании
Вопрос: Как сделать пайплайн (fan-out → fan-in) на каналах?
Ответы
```go
in := gen(10)
// fan-out
w := func(in <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for v := range in {
out <- v * v
}
}()
return out
}
c1 := w(in)
c2 := w(in)
// fan-in
merge := func(a, b <-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
wg.Add(2)
forward := func(ch <-chan int) {
defer wg.Done()
for v := range ch { out <- v }
}
go forward(a)
go forward(b)
go func(){ wg.Wait(); close(out) }()
return out
}
for v := range merge(c1, c2) { fmt.Println(v) }
```
**Как это работает:** `fan-out` распараллеливает работу, `fan-in` объединяет результаты. Важно закрывать выходной канал после завершения всех воркеров.