问题似乎是,您的进程在所有 URL 都可以被跟踪之前就退出了
通过爬虫。由于并发的原因,main()
程序在之前退出
工人们已经完成了。
为了规避这个问题,你可以使用sync.WaitGroup http://golang.org/pkg/sync/#WaitGroup:
func Crawl(url string, depth int, fetcher Fetcher, wg *sync.WaitGroup) {
defer wg.Done()
if depth <= 0 {
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("\nfound: %s %q\n\n", url, body)
for _,u := range urls {
if used[u] == false {
used[u] = true
wg.Add(1)
go Crawl(u, depth-1, fetcher, wg)
}
}
return
}
并打电话Crawl
in main
如下:
func main() {
wg := &sync.WaitGroup{}
Crawl("http://golang.org/", 4, fetcher, wg)
wg.Wait()
}
Also, 不要依赖线程安全的地图 http://golang.org/doc/go_faq.html#atomic_maps.