Основой проблемы является то, что оператор диапазона читает канал, пока канал не будет закрыт. Следовательно, диапазон l oop продолжает ожидать большего ввода от канала ok
, даже если в какой-то момент больше нет входов. В то же время wg.Wait()
ждет, пока финиширует финиш sh. Отсюда тупик!
Либо вам придется закрыть канал ok
в некоторой точке, где больше нет входящих значений в канал ok
.
Или вы можете использовать рабочий пул, например,
package main
import (
"fmt"
"strconv"
"sync"
)
func worker(wg *sync.WaitGroup, ch chan string, i int) {
defer wg.Done()
ch <- "worker process value " + strconv.Itoa(i)
}
func workerMonitor(wg *sync.WaitGroup, ch chan string) {
wg.Wait()
close(ch)
}
func doWork(ch <-chan string, done chan<- bool) {
for i := range ch {
fmt.Println(i)
}
done <- true
}
func main() {
var wg sync.WaitGroup
ch := make(chan string)
var arr = [6]int{1, 3, 2, 5, 3, 9}
for i := 0; i < len(arr); i++ {
wg.Add(1)
if arr[i] >= 5 {
for j := arr[i]; j >= 5; j-- {
wg.Add(1)
go worker(&wg, ch, j-1)
}
}
go worker(&wg, ch, arr[i])
}
go workerMonitor(&wg, ch)
done := make(chan bool, 1)
go doWork(ch, done)
<-done
}
URL игровой площадки