Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 来自'的频道说明;围棋之旅';Webcrawler练习_Go - Fatal编程技术网

Go 来自'的频道说明;围棋之旅';Webcrawler练习

Go 来自'的频道说明;围棋之旅';Webcrawler练习,go,Go,我正在进行“围棋之旅”,并一直在编辑大部分课程,以确保我完全理解它们。我有一个关于以下练习答案的问题:可以在这里找到: 我对以下部分有一个问题: done := make(chan bool) for i, u := range urls { fmt.Printf("-> Crawling child %v/%v of %v : %v.\n", i, len(urls), url, u) go func(url string) { Crawl(url, de

我正在进行“围棋之旅”,并一直在编辑大部分课程,以确保我完全理解它们。我有一个关于以下练习答案的问题:可以在这里找到:

我对以下部分有一个问题:

done := make(chan bool)
for i, u := range urls {
    fmt.Printf("-> Crawling child %v/%v of %v : %v.\n", i, len(urls), url, u)
    go func(url string) {
        Crawl(url, depth-1, fetcher)
        done <- true
    }(u)
}
for i, u := range urls {
    fmt.Printf("<- [%v] %v/%v Waiting for child %v.\n", url, i, len(urls), u)
    <-done
}
fmt.Printf("<- Done with %v\n", url)
done:=make(chan bool)
对于i,u:=范围URL{
fmt.Printf(“->Crawling child%v/%v of%v:%v.\n”,i,len(url),url,u)
go func(url字符串){
爬网(url、深度1、抓取器)

donefor
的第一个
循环计划运行多个goroutine,并在URL片段上迭代

第二个循环阻塞每个url,等待其相应的
Crawl()
调用完成。所有
Crawl()
ER将并行运行并执行其工作,并阻塞退出,直到主线程有机会在每个url的
done
通道上接收消息

在我看来,更好的实现方法是使用。此代码可能会记录错误的内容,具体取决于每次
Crawl()
调用所需的时间,除非
fetcher
锁定

如果您想确定完成
Crawl()
ing的url,可以将完成频道的类型更改为
string
,并在
Crawl()
完成后发送
url
,而不是
true
。然后,我们可以在第二个循环中接收
url

例如:

done := make(chan string)
for _, u := range urls {
    fmt.Printf("-> Crawling %s\n", u)
    go func(url string) {
        Crawl(url, depth-1, fetcher)
        done <- url
    }(u)
}
for range urls {
    fmt.Printf("<- Waiting for next child\n")
    u := <-done
    fmt.Printf("  Done... %s\n", u)
}
done:=make(chan字符串)
对于u,u:=范围URL{
fmt.Printf(“->正在爬网%s\n”,u)
go func(url字符串){
爬网(url、深度1、抓取器)

完成了,谢谢你的解释!我在自己的研究中发现了WaitGroup,它类似于我从Python中熟悉的一些并发概念。但是,我认为我应该尝试并理解如何仅使用前面课程中提到的内容来解决这个练习。继你的解释之后,你是说每个爬虫都有自己的与之关联的n通道?这会更有意义,并解释为什么每个爬虫都对应另一个循环。我认为所有变量都在一个共享空间中,并且认为总共只有一个通道。@Lei如果每个爬虫没有自己的通道,那么只有一个通道。在每个
爬虫之后
函数被执行
url
通过同一个频道发送。你可能想多读一点,并在频道上做一些练习。多诺万和克尼汉编写的Go编程语言是一本好书。谢谢@Ravi,我正在回复Blaskovicz帖子的未编辑版本,现在更清楚的是只有一本频道如我原来所想。我会看看你推荐的书,谢谢!