上篇文章当中实现了单任务版爬虫。

那么这篇文章就大概说下,如何在上一个版本中进行升级改造,使之成为一个多任务版本的爬虫。加快我们爬取的速度。

话不多说,先看图:

其实呢,实现方法就是加了一个scheduler的模块,所有的request都由scheduler去交给worker。

另外呢,这里的worker,也就是上文提到过的fetcher和parser的一个过程。

worker的数量由我们自己在调用engine的时候传入。

每一个worker都是一个groutine。这样可以加快抓取速度,尤其是fetcher那块的。代码如下:

func createWorker(in chan Request, out chan ParseResult) {
go func() {
for {
request := <-in
res, err := Worker(request)
if err != nil {
continue
}
out <- res
}
}()
}

这里的关键呢,就在于scheduler如何分配。

第一种方案是来一个request就给到workChan。

func (s *SimpleScheduler) Submit(r simple_con_engine.Request) {
s.workChan <- r
}

但是,这种方案是不行的。

因为worker的速度太快,而这个给到workChan的速度太慢,会导致卡死。

那么,解决办法可以是每来一个request就都开一个groutine,就可以解决这个事情了。代码也就是这样了:

func (s *SimpleScheduler) Submit(r simple_con_engine.Request) {
go func() { s.workChan <- r }()
}

scheduler做的事情也就是这样了:

这个就可以并发的去执行爬虫的任务了,通过这个scheduler的调度。

经测当workerCount为1时,其实也就相当于是单任务版爬虫为30秒爬取了2046条数据。

当workerCount为10时,这个使用了简单调度器的爬虫为30秒爬取了条数据,实际效率不止增加了10倍

这个使用scheduler去实现简单调度器的并发版爬虫的源码可有:

有。

https://github.com/anmutu/du_crawler/tree/master/03crawler

那么,这个多任务版本的爬虫有什么缺点吗:

有。

当engine给到scheduler的每一个request的时候就会创建一个groutine,这个避免dead lock,但是就会创建无数个groutine,我们的控制力度就小了好多。

golang实现并发爬虫二(简单调度器)的更多相关文章

  1. golang实现并发爬虫三(用队列调度器实现)

    欲看此文,必先可先看: golang实现并发爬虫一(单任务版本爬虫功能) gollang实现并发爬虫二(简单调度器) 上文中的用简单的调度器实现了并发爬虫. 并且,也提到了这种并发爬虫的实现可以提高爬 ...

  2. golang中GPM模型原理与调度器设计策略

    一.GMP模型原理first: 1. 全局队列:存放待运行的G2. P的本地队列:同全局队列类似,存放待运行的G,存储的数量有限:256个,当创建新的G'时,G'优先加入到P的本地队列,如果队列已满, ...

  3. golang实现并发爬虫一(单任务版本爬虫功能)

    目的是写一个golang并发爬虫版本的演化过程. 那么在演化之前,当然是先跑通一下单任务版本的架构. 正如人走路之前是一定要学会爬走一般. 首先看一下单任务版本的爬虫架构,如下: 这是单任务版本爬虫的 ...

  4. golang版并发爬虫

    准备爬取内涵段子的几则笑话,先查看网址:http://www.budejie.com/text/ 简单分析后发现每页的url呈加1趋势 第一页: http://www.budejie.com/text ...

  5. python简单爬虫(二)

    上一篇简单的实现了获取url返回的内容,在这一篇就要第返回的内容进行提取,并将结果保存到html中. 一 . 需求: 抓取主页面:百度百科Python词条   https://baike.baidu. ...

  6. golang的并发

    Golang的并发涉及二个概念: goroutine channel goroutine由关键字go创建. channel由关键字chan定义 channel的理解稍难点, 最简单地, 你把它当成Un ...

  7. scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器

    一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...

  8. 第十四章 kubernetes 核心技术-调度器

    一.概述 一个容器平台的主要功能就是为容器分配运行时所需要的计算,存储和网络资源.容器调 度系统负责选择在最合适的主机上启动容器,并且将它们关联起来.它必须能够自动的处 理容器故障并且能够在更多的主机 ...

  9. YARN的capacity调度器主要配置分析

    yarn中一个基本的调度单元是队列. yarn的内置调度器: 1.FIFO先进先出,一个的简单调度器,适合低负载集群.2.Capacity调度器,给不同队列(即用户或用户组)分配一个预期最小容量,在每 ...

随机推荐

  1. PyTorch 实战-用 Numpy 热身

    Numpy provides an n-dimensional array object, and many functions for manipulating these arrays. Nump ...

  2. NLPer,你知道最近很火的自然语言处理库么?

    介绍 "NLP's ImageNet moment has arrived." 想象一下我们有能力构建支持谷歌翻译的自然语言处理(NLP)模型,并且在Python中仅需几行代码来完 ...

  3. 知识图谱里的知识表示:RDF

    大部分知识图谱使用RDF描述世界上的各种资源,并以三元组的形式保存到知识库中.RDF( Resource Description Framework, 资源描述框架)是一种资源描述语言,它受到元数据标 ...

  4. 8 个出没在 Linux 终端的诡异家伙

    这篇文章,我们一起来到 Linux 的诡异的一面-- 你知道吗?在我们日常使用的 Unix(和 Linux )及其各种各样的分支系统中,存在着一些诡异的命令或进程,它们让人毛骨悚然,有些确实是有害,但 ...

  5. pycharm工程包导入问题

    当我们将外部的python项目导入pycharm工程中时,会出现同一个包的python文件无法在另一个文件引用的问题: 解决方法如下: 在此设置中,将需要导入的文件或包变为蓝色 步骤:1.点击需要导入 ...

  6. 创建Windows10无人值守(自动应答文件)教程

    一.准备工作 系统要求: Windows10 1809版本 工具下载: 镜像:Windows10,任何一个版本都可以,我使用的是1909版本 ed2k://|file|cn_windows_10_bu ...

  7. C 电压

      时间限制 : 10000 MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 JOI社的某个实验室中有着复杂的电路.电路由n个节点和m根细长的电阻组成.节点被标号为1~N ...

  8. SpringMVC知识大览

    SpringMVC大览 springMVC的基础知识 什么是SpringMVC? springmvc框架原理(掌握) 前端控制器.'处理映射器.处理适配器.视图解析器 springmvc的入门程序 目 ...

  9. 【Redis】集群NetCore实战

    环境准备 1. Redis集群(Windows集群搭建) 启动Redis集群,给每个节点加上Title start .conf start .conf start .conf start .conf ...

  10. 原生js弹力球

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...