(3)使用 async 控制并发

知识点

  1. 学习 async(https://github.com/caolan/async ) 的使用。这里有个详细的 async demo 演示:https://github.com/alsotang/async_demo
  2. 学习使用 async 来控制并发连接数。

课程内容

使用eventproxy控制并发(http://www.jianshu.com/p/c13a9977053a)的代码其实是不完美的。为什么这么说,是因为在这个项目之中,之前我使用的是一次性发送20个请求出去而简书因为我发出的并发连接数太多而当你是在恶意请求,虽然并没有把 IP 封掉,但是出现了503错误。所以之后代码之中选择了只发送3个请求。

我们在写爬虫的时候,如果有 1000 个链接要去爬,那么不可能同时发出 1000 个并发链接出去对不对?我们需要控制一下并发的数量,比如并发 10 个就好,然后慢慢抓完这 1000 个链接。

用 async 来做这件事很简单。

这次我们要介绍的是 async 的 mapLimit(arr, limit, iterator, callback) 接口。另外,还有个常用的控制并发连接数的接口是 queue(worker, concurrency),大家可以去 https://github.com/caolan/async#queueworker-concurrency 看看说明。

对了,还有个问题是,什么时候用 eventproxy,什么时候使用 async 呢?它们不都是用来做异步流程控制的吗?

我的答案是:

当你需要去多个源(一般是小于 10 个)汇总数据的时候,用 eventproxy 方便;当你需要用到队列,需要控制并发数,或者你喜欢函数式编程思维时,使用 async。大部分场景是前者,所以我个人大部分时间是用 eventproxy 的。

正题开始。

首先,我们伪造一个 fetchUrl(url, callback) 函数,这个函数的作用就是,当你通过

fetchUrl('http://www.baidu.com', function (err, content) {
  // do something with `content`
});

调用它时,它会返回 http://www.baidu.com 的页面内容回来。

当然,我们这里的返回内容是假的,返回延时是随机的。并且在它被调用时,会告诉你它现在一共被多少个地方并发调用着。

这组链接的长这样:

运行输出是这样的:

可以看到,一开始,并发链接数是从 1 开始增长的,增长到 5 时,就不再增加。当其中有任务完成时,再继续抓取。并发连接数始终控制在 5 个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 目标 使用 async(https://github.com/caolan/async) 来控制并发连接数 新建文...
    与蟒唯舞阅读 3,120评论 2 3
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,762评论 0 4
  • 仿佛要撇清曾经交好一般,我们可以长达几年都不见面 前几日为了写自己这些年的外貌上的变化,翻遍了近十年的照片,很多久...
    我是傻妞阅读 270评论 0 0
  • 今天晚上我给我自己的旅游鞋刷鞋子,洗完脚,我又给我自己的拖鞋刷鞋子。上面刷刷下面是左面刷刷右面刷刷里面刷刷。我觉得...
    41f9d0a5c8db阅读 174评论 0 0