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 关注
- 124 浏览
添加回答
举报