golang - 爬虫中的Goroutine 如何并行抓取
本文介绍了golang - 爬虫中的Goroutine 如何并行抓取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在写一道爬虫的题目,题目要求是
要求支持多routine并行抓取(注意:这里并不是指简单设置GOMAXPROCS>1)
怎么样才是并行抓取?我现在只知道设置runtime.GOMAXPROCS=N
设置GOMAXPROCS是并行抓取吗,为什么?
不是很明白出题人的意思...
解决方案
设置GOMAXPROCS是并行抓取吗,为什么?
不是的, runtime.GOMAXPROCS设置的是 Golang 可利用的最大的操作系统的线程数. 即:
The GOMAXPROCS variable limits the number of operating system threads that can execute user-level Go code simultaneously.
我想你可能需要使用 goroutine, 即协程来实现并发的抓取, 下面是我写的一个简单的示例:
func main() {
max_concurrent_count := 20
wg := sync.WaitGroup{}
wg.Add(max_concurrent_count)
for i := 0; i < max_concurrent_count; i++ {
// 启动协程, 并发地发起 HTTP 请求.
go func() {
defer wg.Done()
resp, _ := http.Get("http://www.baidu.com")
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}()
}
wg.Wait()
}
在上面的例子中, 我使用了
go func() {
...
}
来启动了10个协程, 每个协程都是单独运行的, 它们互不干扰, 并发地完成 HTTP 的请求.
这篇关于golang - 爬虫中的Goroutine 如何并行抓取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文