第一个
for循环调度了多个goroutine来运行,并且正在一片URL上进行迭代。
第二个循环在每个url上阻塞,等待其相应的
Crawl()调用完成。所有用户
Crawl()将并行运行并执行其工作,并阻止退出,直到主线程有机会在
done通道上收到每个URL
的消息。
我认为,实现此效果的更好方法是使用
sync.WaitGroup。此代码可能会记录错误的内容,具体取决于每次
Crawl()调用要花费多长时间(除非
fetcher锁定)。
如果你想确保网址的是成品
Crawl()ING,你可以改变做过通道的类型
string并发送
url,而不是
true一个后
Crawl()完成。然后,我们可以
url在第二个循环中接收。
例:
done := make(chan string)for _, u := range urls { fmt.Printf("-> Crawling %sn", u) go func(url string) { Crawl(url, depth-1, fetcher) done <- url }(u)}for range urls { fmt.Printf("<- Waiting for next childn") u := <-done fmt.Printf(" Done... %sn", u)}


