golang - 爬虫中的Goroutine 如何并行抓取

查看:158
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆