node 使用 async 控制并发的方法


Posted in Javascript onMay 07, 2018

目标

建立一个 lesson5 项目,在其中编写代码。

代码的入口是 app.js,当调用 node app.js 时,它会输出 CNode(https://cnodejs.org/ ) 社区首页的所有主题的标题,链接和第一条评论,以 json 的格式。

注意:与上节课不同,并发连接数需要控制在 5 个。

输出示例:

[
 {
  "title": "【公告】发招聘帖的同学留意一下这里",
  "href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
  "comment1": "呵呵呵呵"
 },
 {
  "title": "发布一款 Sublime Text 下的 JavaScript 语法高亮插件",
  "href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
  "comment1": "沙发!"
 }
]

知识点

学习 async(https://github.com/caolan/async ) 的使用。这里有个详细的 async demo 演示:https://github.com/alsotang/async_demo

学习使用 async 来控制并发连接数。

课程内容

lesson4 的代码其实是不完美的。为什么这么说,是因为在 lesson4 中,我们一次性发了 40 个并发请求出去,要知道,除去 CNode 的话,别的网站有可能会因为你发出的并发连接数太多而当你是在恶意请求,把你的 IP 封掉。

我们在写爬虫的时候,如果有 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 的页面内容回来。

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

// 并发连接数的计数器
var concurrencyCount = 0;
var fetchUrl = function (url, callback) {
 // delay 的值在 2000 以内,是个随机的整数
 var delay = parseInt((Math.random() * 10000000) % 2000, 10);
 concurrencyCount++;
 console.log('现在的并发数是', concurrencyCount, ',正在抓取的是', url, ',耗时' + delay + '毫秒');
 setTimeout(function () {
  concurrencyCount--;
  callback(null, url + ' html content');
 }, delay);
};

我们接着来伪造一组链接

var urls = [];
for(var i = 0; i < 30; i++) {
 urls.push('http://datasource_' + i);
}

这组链接的长这样:

node 使用 async 控制并发的方法

接着,我们使用 async.mapLimit 来并发抓取,并获取结果。

async.mapLimit(urls, 5, function (url, callback) {
 fetchUrl(url, callback);
}, function (err, result) {
 console.log('final:');
 console.log(result);
});

运行输出是这样的:

node 使用 async 控制并发的方法

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript TO HTML 转换
Jun 26 Javascript
两个SUBMIT按钮,如何区分处理
Aug 22 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
jQuery.validate 常用方法及需要注意的问题
Mar 20 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
javascript运动详解
Jul 06 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
React-intl 实现多语言的示例代码
Nov 03 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
浅谈JavaScript 代码简洁之道
Jan 09 Javascript
js实现全选和全不选
Jul 28 Javascript
Angular 数据请求的实现方法
May 07 #Javascript
JavaScript数组去重算法实例小结
May 07 #Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
May 07 #Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
May 07 #Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 #Javascript
Vue 实现树形视图数据功能
May 07 #Javascript
JavaScript 跨域之POST实现方法
May 07 #Javascript
You might like
substr()函数中文版
2006/10/09 PHP
扩展你的 PHP 之入门篇
2006/12/04 PHP
PHP常用函数小技巧
2008/09/11 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
php中如何执行linux命令详解
2018/11/06 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
js 代码优化点滴记录
2012/02/19 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
学生党员的自我评价范文
2014/03/01 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
文明单位汇报材料
2014/12/24 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL