2 回答

TA貢獻1943條經驗 獲得超7個贊
您正在使用for i := range c迭代通道,但代碼不知道何時停止。range在通道上等待通道關閉,或永遠掛起。這就是為什么會出現僵局。
在通過頻道發布所有“url”后,您應該關閉您的頻道。這可以在 的幫助下實現sync.WaitGroup。在getNumbers循環之前,您可以使用 aWaitGroup并設置要等待的作業數len(urls):
wg:=&sync.WaitGroup{}
wg.Add(len(urls))
并在返回之前添加一個新的協程ch:
go func() {
wg.Wait()
close(ch)
} ()
然后在 中allNumbersOfURL,添加WaitGroup作為新參數,并在循環后設置一個完成的工作。
func allNumbersOfURL(url urlNumbers, ch chan int,wg *sync.WaitGroup) {
for _, i := range url.numbers {
ch <- i
}
wg.Done()
}
游樂場:https://play.golang.org/p/--7x7eXIzP9

TA貢獻1851條經驗 獲得超5個贊
通道必須關閉,你可以用來sync.WaitGroup等待任務完成。這是對功能的修改getNumbers
func getNumbers(urls []urlNumbers) <-chan int {
ch := make(chan int)
wg := &sync.WaitGroup{}
for _, url := range urls {
wg.Add(1)
go func(url urlNumbers, ch chan<- int) {
defer wg.Done()
allNumbersOfURL(url, ch)
}(url, ch)
}
go func(wg *sync.WaitGroup, ch chan int) {
wg.Wait()
close(ch)
}(wg, ch)
return ch
}
此外,我建議你在論證傳遞中使用通道方向。
可選的 <- 運算符指定通道方向,發送或接收。如果沒有給出方向,則通道是雙向的。
- 2 回答
- 0 關注
- 161 瀏覽
添加回答
舉報