Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在节点中对任务进行排队_Node.js_Express - Fatal编程技术网

Node.js 在节点中对任务进行排队

Node.js 在节点中对任务进行排队,node.js,express,Node.js,Express,我正在构建一个节点应用程序,它将充当一个“工人”来构建一个新的应用程序,然后将该应用程序上传到AWS。有5项任务完成脚手架循环 我想知道在Node/Express中是否可以对传入请求进行排队,然后在循环成功完成后启动队列中请求的脚手架循环。一次只能运行一个scaffold循环。尝试在传入事件上使用fork: 在每个孩子身上,在处理脚手架和上传到AWS之前,一个接一个地获取所需的所有元素。是的,你可以这样做。也许您当前的代码看起来像这样(我假设您使用的是承诺): 我们将用它来简化事情。首先,我们

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


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

尝试在传入事件上使用fork:


在每个孩子身上,在处理脚手架和上传到AWS之前,一个接一个地获取所需的所有元素。

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

我们将用它来简化事情。首先,我们需要创建一个队列:

var queue = new Queue(1);
参数是队列将同时运行的项目数。因为您不需要并发,所以我们使用
1
。现在,我们需要通过承诺工厂而不是运行承诺:

app.get('/', function (req, res) {
  queue.add(function() {
    return scaffold().then(function() {
      res.send('done');
    });
  });
});
如果我们只是通过一个承诺,它将立即开始。这就是为什么我们必须传递一个返回承诺的函数

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

app.get('/', function (req, res) {
  queue.add(scaffold);
  res.send('done');
});
这不是“严格意义上的node.js”的答案,但我强烈建议将其作为解决此问题的一种方法(用作nodejs库)


将每个任务放入命名作业队列中,仅在准备好处理新作业时才将其拉出,并在准备好后将下一步放入下一个队列中。每次上传新视频时,我们都会使用它来执行一系列复杂的转码步骤,其中每个步骤取决于之前完成的一个或多个步骤。

此应用程序是群集还是单个过程?您喜欢使用
async
style还是promissions来回答问题?@AaronDufour我更喜欢将其作为单个进程运行。我的应用程序不使用promissions,我将进行重构以使用承诺并与您联系。@leaksterrr如果您展示了一些可使用的代码,我很乐意为您提供一些针对非承诺代码的指针。大多数人使用Nginx来摆脱产生新流程以承担工作负载的范式。此外,如果不受监管,这可能成为主要的DoS攻击点。如果您感兴趣,我有一些关于使用beanstalkd的系统的幻灯片
app.get('/', function (req, res) {
  queue.add(scaffold);
  res.send('done');
});