gpt4 book ai didi

go - 练习 : Web Crawler - print not working

转载 作者:IT王子 更新时间:2023-10-29 02:31:00 25 4
gpt4 key购买 nike

I'm a golang newbie and currently working on Exercise: Web Crawler.

我只是简单地在每个调用 func Crawl 的地方前面加上关键字 'go' 并希望它可以并行化,但是 fmt.Printf 不起作用并且什么都不打印。除了这个之外,原始代码没有其他任何变化。有人愿意帮助我吗?

func Crawl(url string, depth int, fetcher Fetcher) {
// TODO: Fetch URLs in parallel.
// TODO: Don't fetch the same URL twice.
// This implementation doesn't do either:
if depth <= 0 {
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n", url, body)
for _, u := range urls {
go Crawl(u, depth-1, fetcher)
}
return
}

func main() {
go Crawl("https://golang.org/", 4, fetcher)
}

最佳答案

根据spec

Program execution begins by initializing the main package and then invoking the function main. When that function invocation returns, the program exits. It does not wait for other (non-main) goroutines to complete.

因此您必须显式地等待另一个 goroutine 在 main() 函数中结束。

一种方法是简单地在 main() 函数的末尾添加 time.Sleep() 直到你认为另一个 goroutine 结束(例如,在这个过程中可能 1 秒例)。

更简洁的方法是使用 sync.WaitGroup如下:

func Crawl(wg *sync.WaitGroup, url string, depth int, fetcher Fetcher) {
defer wg.Done()
if depth <= 0 {
return
}
body, urls, err := fetcher.Fetch(url)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("found: %s %q\n", url, body)
for _, u := range urls {
wg.Add(1)
go Crawl(wg, u, depth-1, fetcher)
}
return
}

func main() {
wg := &sync.WaitGroup{}
wg.Add(1)
// first call does not need to be goroutine since its subroutine is goroutine.
Crawl(wg, "https://golang.org/", 4, fetcher)
//time.Sleep(1000 * time.Millisecond)
wg.Wait()
}

此代码将计数器存储在 WaitGroup 中,使用 wg.Add() 递增它,使用 wg.Done() 递减它并等待直到它使用 wg.Wait() 变为零。

在go playground中确认:https://play.golang.org/p/WqQBqe6iFLp

关于go - 练习 : Web Crawler - print not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54661972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com