2012-06-21 53 views
1

我写的循环,并增加了消息队列(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 

我试图重写到处理一百万个创建使用异步来控制并行运行的工作者函数的数量。这比任何事情都是一次学习练习。

https://github.com/caolan/async#queue

这是异步的队列的基本设置和我无所适从,以什么我需要改变我的一种。我不认为下面会工作:

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); 
} 

我不完全掌握如何将它与异步一起拉。

+0

quiickly skimming这看起来对我好吗? – Alfred

+0

@Alfred,我将百万变成了500,进行测试。结果发生的是我看到“完成处理foo”打印到屏幕500次,然后从messageCreated(从azure放置消息的回调)第一个控制台日志。 – lucuma

回答

4

这是你的错误:

var q = async.queue(function (task, callback) { 
    queueService.createMessage(queueName, task.msg, null, messageCreated); 
    callback(); 
}, 100); 

你在做什么是创建队列的消息,并随即通过延续(调用回调)。你想要做的是通过传递给createMessage回调内部延续:

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回调的更新界面。

+0

“createMessage”的*回调*是函数messageCreated (错误,serverQueue,serverResponse)'所以我不能像你这样称呼它。这是我的困惑存在的地方。 – lucuma

+0

感谢您告诉我界面!答案已更新。 –

+0

在推送发生的for循环中,如果我在推送之后使用console.log:'console.log('pushing:'+ i);''你会希望看到'i'打印1000000次,然后队列开始处理,或者你希望队列在for循环处理的同时开始处理?例如,我希望看到'推:1推:2推:3完成处理foo推:4'等 – lucuma

相关问题