大发彩票网首页

        node 使用 async 控制并发的方法

        时间:2018-05-07来源:大发彩票网 www.lhltmj.com 作者:源码库 文章热度:

        大发彩票网 www.lhltmj.com 目标

        建立一个 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,nodejs,并发,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,nodejs,并发,node使用async

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

        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU源码库。


        注:相关教程知识阅读请移步到JavaScript/Ajax教程频道。
        相关JavaScript/Ajax教程
        热门标签

        JavaScript/Ajax教程Rss订阅JavaScript/Ajax教程搜索

        大发彩票网官网 | 大发彩票网平台 |
      • 【网易彩票】浮世绘的演进:从汉代中国到现代日本 2018-11-01
      • 【走势图】【广之旅】台湾个人旅游自由行入台证(全国受理) 2018-11-01
      • 【北京福彩网】新浪体育评现役50大第50-41:火箭超6携小曼巴 2018-11-01
      • 【常见问题】日常系列 科普某知名七大兽人氏族杂谈 2018-11-01
      • 【中奖新闻】暗黑时光手游下载v1.0.2 暗黑时光手游官方下载 2018-11-01
      • 【体彩P3】红色警戒2实用攻略秘籍 2018-11-01
      • 【开奖对应】ccleaner中文版|CCleaner(系统垃圾清理工具cc清理器下载)V5.46.0.6652绿色中文版下载 2018-11-01
      • 【彩票开奖直播信息】【新年小黑块】新年小黑块小游戏 2018-11-01
      • 【赔率中心】笔记本系统重装教程,笔记本电脑u盘启动盘装系统教程 2018-11-01
      • 【彩票工具】铁观音为什么要冷藏 因为这个原因 2018-11-01
      • 【上海体彩网】体验这款记录仪后 我发现了路趣T8的秘密【图】 2018-11-01
      • 【北京福彩网】设备维保技术服务工程师SE 2018-11-01
      • 【彩票工具】粉丝探访大熊猫食品专供基地 亲手采摘新鲜竹笋 2018-11-01
      • 【百度彩票】35年梦想成真,秘鲁闯进世界杯 2018-10-30
      • 【中奖信息】如何选佛山吉祥号码,手机号,座机号,终身受用。 2018-10-30