当前位置: 首页 > 面试题库 >

“围棋之旅”网络爬虫练习中的频道说明

牟华翰
2023-03-14
问题内容
我正在经历“ A Go of
Go”,并且一直在编辑大多数课程,以确保我完全理解它们。我对以下练习的答案有疑问: https
:
//tour.golang.org/concurrency/10,可在此处找到: https
//github.com/golang/tour/blob/master/solutions/
webcrawler.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, 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)

从通道添加和删除true
done并运行两个单独的for循环有什么目的?它只是阻塞直到go例程完成?我知道这是一个示例练习,但是这种做法是否首先克服了新线程的不足?

为什么go Crawl(url, depth-1, fetcher)没有第二个for循环和done通道就不能打电话?是否因为所有变量共享存储空间?

谢谢!


问题答案:

第一个for循环调度了多个goroutine来运行,并且正在一片URL上进行迭代

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

我认为,实现此效果的更好方法是使用sync.WaitGroup。此代码可能会记录错误的内容,具体取决于每次Crawl()调用要花费多长时间(除非fetcher锁定)。

如果你想确保网址的是成品Crawl()ING,你可以改变做过通道的类型string并发送url,而不是true一个后Crawl()完成。然后,我们可以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)
}


 类似资料:
  • 我正在进行围棋之旅,我觉得除了并发性之外,我对这门语言有很好的理解。 幻灯片10是一个练习,要求读者并行化一个网络爬虫(并使其不覆盖重复,但我还没有做到。) 以下是我到目前为止的情况: 我的问题是,在哪里我把调用。 如果我在方法中的某个地方放置了,那么程序最终会从一个派生的goroutine写入一个闭合通道,因为对的调用将在派生的goroutine执行之前返回。 如果我省略了对的调用,正如我所演示

  • 我正在尝试解决围棋练习之旅,读者: 下面是我的解决方案: 它返回,这意味着只有第一个单词lbh penpxrq gur pbqr!是裂开的。我怎样才能破解整个句子?

  • 本文向大家介绍从零学习node.js之简易的网络爬虫(四),包括了从零学习node.js之简易的网络爬虫(四)的使用技巧和注意事项,需要的朋友参考一下 前言 之前已经介绍了node.js的一些基本知识,下面这篇文章我们的目标是学习完本节课程后,能进行网页简单的分析与抓取,对抓取到的信息进行输出和文本保存。 爬虫的思路很简单: 确定要抓取的URL; 对URL进行抓取,获取网页内容; 对内容进行分析并

  • 主要内容:认识爬虫,爬虫分类,爬虫应用,爬虫是一把双刃剑,为什么用Python做爬虫,编写爬虫的流程网络爬虫又称网络蜘蛛、网络机器人,它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。 认识爬虫 我们所熟悉的一系列搜索引擎都是大型的网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都拥有自己的爬虫程序,比如 360 浏览器的爬虫称作 360Spider,搜狗的爬虫叫做

  • 案例:爬取百度新闻首页的新闻标题信息 url地址:http://news.baidu.com/ 具体实现步骤: 导入urlib库和re正则 使用urllib.request.Request()创建request请求对象 使用urllib.request.urlopen执行信息爬取,并返回Response对象 使用read()读取信息,使用decode()执行解码 使用re正则解析结果 遍历输出结果

  • 5.1 网络爬虫概述: 网络爬虫(Web Spider)又称网络蜘蛛、网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。 网络爬虫按照系统结构和实现技术,大致可分为一下集中类型: 通用网络爬虫:就是尽可能大的网络覆盖率,如 搜索引擎(百度、雅虎和谷歌等…)。 聚焦网络爬虫:有目标性,选择性地访问万维网来爬取信息。 增量式网络爬虫:只爬取新产生的或者已经更新的页面信息。特点:耗费