为了账号安全,请及时绑定邮箱和手机立即绑定

Go Tour爬虫运动带来的麻烦

Go Tour爬虫运动带来的麻烦

Go
BIG阳 2021-05-10 10:24:38
我正在进行巡回演出,我觉得除了并发以外,我对语言有了很好的理解。在幻灯片72上,有一个练习,要求读者并行化Web爬网程序(并使其不覆盖重复的内容,但我还没有到达那里。)这是我到目前为止的内容:func Crawl(url string, depth int, fetcher Fetcher, ch chan string) {    if depth <= 0 {        return    }    body, urls, err := fetcher.Fetch(url)    if err != nil {        ch <- fmt.Sprintln(err)        return    }    ch <- fmt.Sprintf("found: %s %q\n", url, body)    for _, u := range urls {        go Crawl(u, depth-1, fetcher, ch)    }}func main() {    ch := make(chan string, 100)    go Crawl("http://golang.org/", 4, fetcher, ch)    for i := range ch {        fmt.Println(i)    }}我的问题是在哪里close(ch)打电话。如果我defer close(ch)在Crawl方法中的某处放置了一个对象,那么我最终会在其中一个生成的goroutine中写入一个封闭的通道,因为该方法将在生成的goroutine之前完成执行。如果我省略了对close(ch)代码的调用,如我的示例代码所示,则在所有goroutine完成执行后,程序将死锁,但主线程仍在for循环中的通道上等待,因为该通道从未关闭过。
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信