【发布时间】:2018-03-26 17:54:08
【问题描述】:
我一直在关注这个solution。当我运行竞态检测器时,没有检测到竞态条件。但是当我用我的代码运行比赛检测器时,它会出现以下错误:
================== WARNING: DATA RACE Read at 0x00c42006c1e0 by goroutine 6: main.Crawl.func1() /task2.go:50 +0x53
主 goroutine 在 0x00c42006c1e0 上一次写入:main.Crawl() /task2.go:48 +0x692 main.main() /task2.go:66 +0x8c
Goroutine 6 (running) 创建于:main.Crawl() /task2.go:49 +0x61e main.main() /task2.go:66 +0x8c ================== 。 . . ================== WARNING: DATA RACE Read at 0x00c420094070 by goroutine 8: main.Crawl.func1() /task2.go:50 +0x53
goroutine 6 之前在 0x00c420094070 处写入:main.Crawl() /task2.go:48 +0x692 main.Crawl.func1() /task2.go:51 +0x240
Goroutine 8 (running) 创建于:main.Crawl() /task2.go:49 +0x61e main.Crawl.func1() /task2.go:51 +0x240
Goroutine 6 (running) 创建于:main.Crawl() /task2.go:49 +0x61e main.main()
/task2.go:66 +0x8c
发现 2 个数据竞争退出状态 66
以下是我的代码,谁能告诉我哪里出错了。想了很久还是没认出来。
var visited = struct {
urls map[string]bool
sync.Mutex
}{urls: make(map[string]bool)}
func Crawl(url string, depth int, fetcher Fetcher) {
if depth <= 0 {
return
}
visited.Lock()
if visited.urls[url] && visited.urls[url] == true {
fmt.Println("already fetched: ", url)
visited.Unlock()
return
}
visited.urls[url] = true
visited.Unlock()
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
done := make(chan bool)
for _, nestedUrl := range urls {
go func(url string, d int) {
fmt.Printf("-> Crawling child %v of %v with depth %v \n", nestedUrl, url, depth)
Crawl(url, d, fetcher)
done <- true
}(nestedUrl, depth-1)
}
for i := range urls {
fmt.Printf("<- [%v] %v/%v Waiting for child %v.\n", url, i, len(urls))
<-done
}
fmt.Printf("<- Done with %v\n", url)
}
func main() {
Crawl("http://golang.org/", 4, fetcher)
fmt.Println("Fetching stats\n--------------")
for url, err := range visited.urls {
if err != true {
fmt.Printf("%v failed: %v\n", url, err)
} else {
fmt.Printf("%v was fetched\n", url)
}
}
}
【问题讨论】:
-
你能显示整个文件吗?可能在 play.google.com 或 github 上?现在还不清楚种族恐慌的界限在哪里。
-
可能在子 goroutine
Printf调用中使用了nestedUrl。 -
如果您不共享整个文件,我们无法知道哪一行出现故障
-
以后一定要给出行号或操场上的所有代码,因为这样会更容易。
-
您好,感谢您的回复,这里是代码文件github.com/aneelaSaleem/Go/blob/master/task2.go
标签: go synchronization web-crawler mutex