題目:Exercise: Web Crawler
直接參考了 https://github.com/golang/tour/blob/master/solutions/webcrawler.go 的實作,不過該代碼使用了chan bool來存放子協程是否執行完成,我的代碼是使用WaitGroup來讓主協程等待子協程執行完成,
完整代碼請參考 https://github.com/sxpujs/go-example/blob/master/crawl/web-crawler.go
相對原程式增加的代碼如下:
var fetched = struct {
m map[string]error
sync.Mutex
}{m: map[string]error{}}
// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher) {
if _, ok := fetched.m[url]; ok || depth <= 0 {
return
}
body, urls, err := fetcher.Fetch(url)
fetched.Lock()
fetched.m[url] = err
fetched.Unlock()
if err != nil {
return
}
fmt.Printf("Found: %s %q\n", url, body)
var wg sync.WaitGroup
for _, u := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
Crawl(url, depth-1, fetcher)
}(u)
}
wg.Wait()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/40881.html
標籤:Go
上一篇:Go并發模式代碼示例
