【发布时间】:2018-10-17 09:37:58
【问题描述】:
我正在实现一个网络爬虫,我有一个Parse 函数,它接受一个链接作为输入,并且应该返回页面中包含的所有链接。
我想充分利用 goroutine 使其尽可能快。为此,我想创建一个工人池。
我设置了一个表示链接links := make(chan string) 的字符串通道,并将其作为参数传递给Parse 函数。我希望工人通过独特的渠道进行交流。当函数启动时,它从links 获取一个链接,对其进行解析并**对于页面中找到的每个有效链接,将链接添加到links。
func Parse(links chan string) {
l := <- links
// If link already parsed, return
for url := newUrlFounds {
links <- url
}
}
但是,这里的主要问题是指出何时没有找到更多链接。我想到的一种方法是在所有工人完成之前等待。但我不知道如何在 Go 中这样做。
【问题讨论】:
-
我不确定您的频道设计是否最佳。例如,如果
links处于无缓冲状态,并且只有一个工作程序 go 例程在运行Parse,那么当找到新 URL 时,您会遇到死锁。
标签: go concurrency threadpool goroutine