HTTP Getリクエストがあり、レスポンスを解析してデータベースに保存したいと思います。
独立してcrawl(i)を呼び出すと、良い結果が得られます。しかし、1から2000までcroll()を呼び出す必要があります。良い結果が得られますが、一部の応答が失われたように見え、一部の応答が重複しています。何千もの非同期関数を呼び出す方法がわからないと思います。非同期モジュールキュー機能を使用していますが、これまでのところ、いくつかのデータが欠落しており、いくつかの重複があります。私はここで何が間違っているのですか?ご協力いただきありがとうございます。
私のノード機能:
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キューメソッドをスローダウンする方法はありますか?