Есть простая задача. Запустить go приложение в N потоков. Данные для потоков есть перед запуском потоков и добавляются в процессе выполнения.
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
ok := make(chan int, 3)
for i := 0; i < 2; i++ {
wg.Add(1)
go func(i int, wg *sync.WaitGroup) {
for x := range ok {
fmt.Println(i, x)
if x >= 5 {
ok <- x - 1
}
}
wg.Done()
}(i, &wg)
}
ok <- 1
ok <- 3
ok <- 2
ok <- 5
ok <- 3
ok <- 9
wg.Wait()
}
Не понимаю как правильно "подкитывать" в channel, чтобы не падало все в конце с
fatal error: all goroutines are asleep - deadlock!
Чтобы этот код не упал, нужно закрыть channel и туда уже не добавлять. Но мне нужны еще задачи, которые надо выполнить. Как правильно это организовать?!