怎么使用node中async控制并发

这次给大家带来怎么使用node中async控制并发,使用node中async控制并发的注意事项有哪些,下面就是实战案例,一起来看一下。

目标

建立一个 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 个。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

如何让node中promise替代回调函数

怎样用Vue+better-scroll实现字母索引导航

以上就是怎么使用node中async控制并发的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2758994.html

(0)
上一篇 2025年3月8日 08:20:59
下一篇 2025年3月8日 08:21:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • ajax设置async校验用户名是否存在的实现方法

    下面我就为大家带来一篇ajax设置async校验用户名是否存在的实现方法。现在就分享给大家,也给大家做个参考。 新增一个用户的时候,需要判断这个手机号码是否存在,最开始的想法很简单在textbox上设置一个onmouseout事件,在IE下…

    2025年3月8日
    200
  • 如何用node实现爬虫功能

    这次给大家带来如何用node实现爬虫功能,用node实现爬虫功能的注意事项有哪些,下面就是实战案例,一起来看一下。 node是服务器端的语言,所以可以像python一样对网站进行爬取,下面就使用node对博客园进行爬取,得到其中所有的章节信…

    2025年3月8日
    200
  • 怎样使linux后台运行node服务指令

    这次给大家带来,的注意事项有哪些,下面就是实战案例,一起来看一下。 启动node 服务时候发现 node servier.js跑起来之后,一旦断开连接,服务也就停了, 使用 nohup node servier.js & 就可以让代…

    编程技术 2025年3月8日
    200
  • Ajax请求中async:false/true的作用分析

    这篇文章主要介绍了ajax请求中async:false/true的作用,结合实例形式分析说明了ajax请求中async:false/true的具体功能与使用技巧,需要的朋友可以参考下 本文实例分析了Ajax请求中async:false/tr…

    编程技术 2025年3月8日
    200
  • ajax中的async属性值之同步和异步及同步和异步区别

    在jquery中ajax方法中async用于控制同步和异步,当async值为true时是异步请求,当async值为fase时是同步请求。ajax中async这个属性,用于控制请求数据的方式,默认是true,即默认以异步的方式请求数据。 jq…

    编程技术 2025年3月8日
    200
  • linux后台运行node服务指令步骤方法

    这次给大家带来linux后台运行node服务指令步骤方法,linux后台运行node服务指令的linux有哪些,下面就是实战案例,一起来看一下。 启动node 服务时候发现 node servier.js跑起来之后,一旦断开连接,服务也就停…

    编程技术 2025年3月8日
    200
  • 如何使用node结合swig渲染摸板

    这次给大家带来如何使用node结合swig渲染摸板,使用node结合swig渲染摸板的注意事项有哪些,下面就是实战案例,一起来看一下。 首先当然是利用express框架在node后台上面搭建服务 var express = require(…

    2025年3月8日
    200
  • 怎么使用node实现基于token身份验证

    这次给大家带来怎么使用node实现基于token身份验证,使用node实现基于token身份验证的注意事项有哪些,下面就是实战案例,一起来看一下。 最近研究了下基于token的身份验证,并将这种机制整合在个人项目中。现在很多网站的认证方式都…

    编程技术 2025年3月8日
    200
  • 手写Node静态资源服务器的实现方法

    这篇文章主要介绍了手写node静态资源服务器的实现方法,现在分享给大家,也给大家做个参考。 想写静态资源服务器,首先我们需要知道如何创建一个http服务器,它的原理是什么 http服务器是继承自tcp服务器 http协议是应用层协议,是基于…

    2025年3月8日 编程技术
    200
  • 浅谈Node 调试工具入门教程

    这篇文章主要介绍了浅谈node 调试工具入门教程,现在分享给大家,也给大家做个参考。 JavaScript 程序越来越复杂,调试工具的重要性日益凸显。客户端脚本有浏览器,Node 脚本怎么调试呢? 2016年,Node 决定将 Chrome…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论