Пул с двумя каналами: tasks закрывает производитель, results — отдельная горутина после wg.Wait(). Реализуйте processAll: воркеры читают tasks и шлют в results.
- Задача
- Решение
- Обсуждение
ProcessResults: пул с каналом результатов
GolangРешение
func processAll(items []int, workers int) []int {
tasks := make(chan int)
results := make(chan int)
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for t := range tasks {
results <- t * 2
}
}()
}
go func() {
wg.Wait()
close(results)
}()
go func() {
for _, item := range items {
tasks <- item
}
close(tasks)
}()
var out []int
for r := range results {
out = append(out, r)
}
return out
}