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 相关文章推荐
删除select中所有option选项jquery代码
Aug 12 Javascript
JavaScript节点及列表操作实例小结
Aug 05 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
javascript用正则表达式过滤空格的实现代码
Jun 14 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
Nov 30 Javascript
jQuery ajax的功能实现方法详解
Jan 06 Javascript
p5.js 毕达哥拉斯树的实现代码
Mar 23 Javascript
vue+webpack实现异步加载三种用法示例详解
Apr 24 Javascript
Vue.js 2.x之组件的定义和注册图文详解
Jun 19 Javascript
vue多次循环操作示例
Feb 08 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 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
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
php自动适应范围的分页代码
2008/08/05 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
Yii针对添加行的增删改查操作示例
2016/10/18 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
JS 常用校验函数
2009/03/26 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
js变换显示图片的实例
2013/04/16 Javascript
js计算两个时间之间天数差的实例代码
2013/11/19 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
点击显示指定元素隐藏其他同辈元素的方法
2014/02/19 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
python xml解析实例详解
2016/11/14 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
大学生学习2014全国两会心得体会
2014/03/13 职场文书
学校开学标语
2014/10/06 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
典型事迹材料范文
2014/12/29 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
python库sklearn常用操作
2021/08/23 Python
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript