在Node中排队任务

我正在构build一个节点应用程序,它将充当“工作人员”来构build新的应用程序,然后将应用程序上传到AWS。 有5个任务完成脚手架循环。

我想知道在Node / Express中是否有可能对传入的请求进行排队,然后在成功完成循环后为队列中的请求启动脚手​​架循环。 一次只能有一个脚手架循环。

是的,你可以这么做。 也许你现在的代码看起来像这样(我假设你使用的是承诺):

 app.get('/', function (req, res) { scaffold().then(function() { res.send('done'); }); }); 

我们将使用promise-queue来简化事情。 首先我们需要创build一个队列:

 var queue = new Queue(1); 

参数是队列将同时运行的项目数量。 既然你不想要并发,我们使用1 。 现在,我们需要通过承诺工厂,而不是承诺:

 app.get('/', function (req, res) { queue.add(function() { return scaffold().then(function() { res.send('done'); }); }); }); 

如果我们刚刚通过承诺,它会立即开始。 那就是为什么我们必须通过一个返回诺言的函数。

如果您想要立即回应请求,而不是等待任务完成,则可以将其移至承诺工厂之外。 这也允许我们避免额外的匿名函数,因为现在scaffold是我们要排队的承诺工厂。

 app.get('/', function (req, res) { queue.add(scaffold); res.send('done'); }); 

这不是“严格node.js”的答案,但我强烈build议寻找Beanstalkd作为解决这个问题的一种方法(使用fivebeans作为nodejs库)。

把你的每个任务都放在一个指定的工作队列中,只有当你准备好处理它时,才能把一个新工作拿出来,并在下一个工作准备就绪的时候进入下一个队列。 我们在生产中使用它来在每次上传新video时执行一系列复杂的代码转换步骤,其中每个步骤取决于一个或多个先前完成的步骤。

尝试在传入的事件中使用fork:

http://nodejs.org/api/child_process.html

对每个孩子,在处理脚手架和上传到AWS之前,逐一获取所有要素。