다음은이 solution입니다. 경쟁 탐지기를 실행할 때 탐지 된 경쟁 조건이 없습니다. Golang 웹 크롤러 솔루션, 2 데이터 레이스, 종료 상태 66
================== WARNING: DATA RACE Read at 0x00c42006c1e0 by goroutine 6: main.Crawl.func1() /task2.go:50 +0x53
Previous write at 0x00c42006c1e0 by main goroutine: main.Crawl() /task2.go:48 +0x692 main.main() /task2.go:66 +0x8c
Goroutine 6 (running) created at: 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
Previous write at 0x00c420094070 by goroutine 6: main.Crawl() /task2.go:48 +0x692 main.Crawl.func1() /task2.go:51 +0x240
Goroutine 8 (running) created at: main.Crawl() /task2.go:49 +0x61e main.Crawl.func1() /task2.go:51 +0x240
Goroutine 6 (running) created at: main.Crawl() /task2.go:49 +0x61e main.main()
/task2.go:66 +0x8c
Found 2 data race(s) exit status 66
다음
내 코드, 내가 잘못된거야 어디 사람이 나에게 알려 주시기 바랍니다 수 있습니다 : 난 내 코드와 경주 detecter를 실행할 때 다음과 같은 오류를 제공합니다. 나는 오랫동안 그것을 알아 내려고 노력했지만 식별 할 수 없었다. 당신은 재귀하는 이동 루틴을 발사 크롤링를 호출하고 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'을 * 사용했을 것입니다. –
전체 파일을 공유하지 않으면 어떤 줄이 실패했는지 알 수 없습니다. –