处理消息队列和使用asynchronous
我写了一个小的testing节点应用程序,循环并将消息添加到队列(azure色的存储队列),如下所示:
var queueService = azure.createQueueService(); var queueName = 'taskqueue'; // other stuff like check if created // loop called after queue is confirmed for (i=0;i<1000;i++){ queueService.createMessage(queueName, "Hello world!", null, messageCreated); } // messageCreated does nothing at the moment, just logs to console
我试图重写,以处理说100万创build使用asynchronous来控制并行运行的工作者函数的数量。 这比任何事情都是一个学习练习。
https://github.com/caolan/async#queue
这是asynchronous队列的基本设置,对于我需要更改的内容,我感到不知所措。 我不认为下面的工作:
var q = async.queue(function (task, callback) { queueService.createMessage(queueName, task.msg, null, messageCreated); callback(); }, 100); // assign a callback. Called when all the queues have been processed q.drain = function() { console.log('all items have been processed'); } // add some items to the queue for(i=0;i<1000000;i++) { q.push({msg: 'Hello World'}, function (err) { console.log('finished processing foo'); }); console.log('pushing: ' + i); }
我不太清楚如何将它们与asynchronous结合在一起。
这是你的错误:
var q = async.queue(function (task, callback) { queueService.createMessage(queueName, task.msg, null, messageCreated); callback(); }, 100);
你正在做的是在队列中创build一条消息,然后立即传递继续(调用callback)。 你想要做的是在传递给createMessage
的callback中传递continuation:
var q = async.queue(function (task, callback) { queueService.createMessage(queueName, task.msg, null, function(error, serverQueue, serverResponse) { callback(error, serverQueue, serverResponse); messageCreated(error, serverQueue, serverResponse); }); }, 100);
现在每个任务都会在任务完成之后报告完成。
编辑:更新了createMessage
callback的界面。