2 回答
TA贡献1795条经验 获得超7个赞
对我来说,它看起来不像是从您的频道读取,并且因为它是一个同步频道(您从未在其上声明长度),如果它接收到一个值,它就会阻塞。所以你需要从你的c
byvalue <- c
或你的 fetch 函数中读取c <- *e
这导致你sync.WaitGroup
永远wg.Done()
不会减少计数器,这永远不会导致wg.Wait()
停止阻塞,这导致你close(c)
永远不会被调用
TA贡献1851条经验 获得超3个赞
我的原始代码是这样的:
e_hrefs := findHrefs(u)
w := csv.NewWriter(file)
for e_href, name := range e_hrefs {
wg.Add(1)
go fetch(parsedUrl.Scheme+"://"+parsedUrl.Host+e_href, name, &wg, c)
e := <-c
w.Write([]string{name, "'" + e.tax_code, e.group, e.capital})
w.Flush()
}
wg.Wait()
你可以看到,这不是并发。
我刚刚通过使用range子句迭代通道来修复:
e_hrefs := findHrefs(u)
for e_href, name := range e_hrefs {
wg.Add(1)
go fetch(parsedUrl.Scheme+"://"+parsedUrl.Host+e_href, name, &wg, c)
}
go func() {
wg.Wait()
close(c)
}()
w := csv.NewWriter(file)
for e := range c {
w.Write([]string{e.name, "'" + e.tax_code, e.group, e.capital})
w.Flush()
}
添加回答
举报