如何在节点中使用异步控制并发?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
建立一个lesson5项目,在其中编写代码。
代码的入口是app.js,当调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"才能:,“沙发!“ ,} )
<强>知识点强>
学习异步(https://github.com/caolan/async)的使用。这里有个详细的异步演示演示:https://github.com/alsotang/async_demo
学习使用异步来控制并发连接数。
<强>课程内容强>
lesson4的代码其实是不完美的。为什么这么说,是因为在lesson4中,我们一次性发了40个并发请求出去,要知道,除去CNode的话,别的网站有可能会因为你发出的并发连接数太多而当你是在恶意请求,把你的IP封掉。
我们在写爬虫的时候,如果有1000个链接要去爬,那么不可能同时发出1000个并发链接出去对不对吗?我们需要控制一下并发的数量,比如并发10个就好,然后慢慢抓完这1000个链接。
用异步来做这件事很简单。
这次我们要介绍的是异步的<代码> mapLimit(加勒比海盗、限制、迭代器回调)代码>接口。另外,还有个常用的控制并发连接数的接口是<代码>队列(工、并发性),代码>大家可以去https://github.com/caolan/async queueworker-concurrency看看说明。
这回我就不带大家爬网站了,我们来专注知识点:并发连接数控制。
对了,还有个问题是,什么时候用eventproxy,什么时候使用异步呢?它们不都是用来做异步流程控制的吗?
我的答案是:
当你需要去多个源(一般是小于10个)汇总数据的时候,用eventproxy方便;当你需要用到队列,需要控制并发数,或者你喜欢函数式编程思维时,使用异步。大部分场景是前者,所以我个人大部分时间是用eventproxy的。
正题开始。
首先,我们伪造一个<代码> fetchUrl (url,回调)代码>函数,这个函数的作用就是,当你通过
fetchUrl (& # 39; http://www.baidu.com& # 39;,, function (呃,,内容),{ ,//do something  with “内容” });
调用它时,它会返回http://www.baidu.com的页面内容回来。
当然,我们这里的返回内容是假的,返回延时是随机的。并且在它被调用时,会告诉你它现在一共被多少个地方并发调用着。
//,并发连接数的计数器 var concurrencyCount =, 0; var fetchUrl =, function (url,,回调),{ ,//delay 的值在,2000年,以内,是个随机的整数 ,var delay =,方法((math . random(), *, 10000000), %, 2000年,10); ,concurrencyCount + +; ,console.log(& # 39;现在的并发数是& # 39;,,concurrencyCount,, & # 39;,正在抓取的是& # 39;,,url, & # 39;,耗时& # 39;,+,delay +, & # 39;毫秒& # 39;); ,setTimeout (function (), { concurrencyCount——才能; 回调才能(零,url +, & # 39;, html 内容# 39;); ,},延迟); };
我们接着来伪造一组链接
var urls =, []; (var 小姐:=,0;,小姐:& lt;, 30;,我+ +),{ ,urls.push (& # 39; http://datasource_& # 39;, +, i); }
这组链接的长这样:
接着,我们使用异步。mapLimit来并发抓取,并获取结果。
async.mapLimit (url, 5, function (url,回调),{ ,fetchUrl (url,回调); },,function (呃,,结果),{ 最后,console.log (& # 39;: & # 39;); ,console.log(结果); });
运行输出是这样的:
关于如何在节点中使用异步控制并发问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。