大佬教程收集整理的这篇文章主要介绍了node.js – NodeJS异步队列太快(减慢异步队列方法),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我打电话抓(i)独立,我会得到很好的结果.但我必须从1到2000调用crawl().
我得到了很好的结果,但有些回复似乎丢失了,有些回复是重复的.我不认为我理解如何调用数千个异步函数.我正在使用async module队列功能,但到目前为止,我仍然缺少一些数据,但仍然有一些重复.我在这做错了什么?谢谢你的帮助.
我的节点功能:
function getOptions(i) { return { host: 'magicseaweed.com',path: '/synDicate/RSS/index.PHP?id='+i+'&unit=uk',method: 'GET' } }; function crawl(i){ var req = http.request(getOptions(i),function(res) { res.on('data',function (body) { parseLOCATIOn(body); }); }); req.end(); } function parseLOCATIOn(body){ parser.parseString(body,function(err,result) { if(result && typeof result.RSS != 'undefined') { var LOCATIOntitle = result.RSS.chAnnel[0].title; var LOCATIOnString = result.RSS.chAnnel[0].item[0].link[0]; var LOCATIOn = new LOCATIOn({ id: LOCATIOnString.split('/')[2],name: LOCATIOntitle }); LOCATIOn.save(); } }); } N = 2 //# of simultaneous tasks var q = async.queue(function (task,callBACk) { crawl(task.url); callBACk(); },N); q.drain = function() { console.log('Crawling done.'); } for(var i = 0; i < 100; i++){ q.push({url: 'http://magicseaweed.com/synDicate/RSS/index.PHP?id='+i+'&unit=uk'}); }
[编辑]很好,经过大量的测试后,似乎我正在抓取的服务无法处理如此多的快速请求.因为当我按顺序执行每个请求时,我可以获得所有好的响应.
有没有办法慢下来ASYNC队列方法?
N = # of simultaneous tasks var q = async.queue(function (task,callBACk) { somehttprequestfunction(task.url,function(){ callBACk(); } },N); q.drain = function() { console.log('all items have been processed'); } for(var i = 0; i < 2000; i++){ q.push({url:"http://somewebsite.com/"+i+"/Feed/"}); }
如果您只调用回调函数,它将有一个正在进行的操作窗口,任务室将可用于将来的任务.不同的是,您的代码现在可以立即打开2000个连接,显然失败率很高.将其限制在合理的值,5,10,20(取决于站点和连接)将导致更好的成功率.如果请求失败,您可以再次尝试,或将任务推送到另一个异步队列以进行另一个试验.关键是在队列函数中调用callBACk(),以便在完成后可以使用房间.
以上是大佬教程为你收集整理的node.js – NodeJS异步队列太快(减慢异步队列方法)全部内容,希望文章能够帮你解决node.js – NodeJS异步队列太快(减慢异步队列方法)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。