Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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_Async.js - Fatal编程技术网

Node.js 异步队列并发任务

Node.js 异步队列并发任务,node.js,async.js,Node.js,Async.js,我正在使用async.queue来确保服务中的某些文件拷贝最多同时发生n,但有时我看到的文件拷贝比队列允许的多得多。有人看到我在下面的实现中遗漏了什么吗 createQueue(limit: number) { let self = this; return async.queue(function(cmdObj, callback) { console.log("Beginning copy"); let cmd = cmdObj.cmd;

我正在使用
async.queue
来确保服务中的某些文件拷贝最多同时发生
n
,但有时我看到的文件拷贝比队列允许的多得多。有人看到我在下面的实现中遗漏了什么吗

createQueue(limit: number) {
    let self = this;
    return async.queue(function(cmdObj, callback) {
      console.log("Beginning copy");
      let cmd = cmdObj.cmd;
      let args = cmdObj.args;
      let request = cmdObj.req;
      request.state = State.IN_PROGRESS;
      self.reportStatus(request.destination);
      const proc = spawn(cmd, args); //uses an rsync command upstream
      proc.on("close", code => {
        if (code !== 0) {
          request.state = State.ERRORED;
          self.reportStatus(request.destination); // these just report to the caller
          statusMap.delete(request.destination);
        } else {
          fs.rename(request.destination + ".part", request.destination);
          request.state = State.COMPLETED;
          self.reportStatus(request.destination); // same here
          statusMap.delete(request.destination);
        }
        callback();
      });
      proc.on("error", err => {
        console.error("COPY ERR: " + err);
      });
    }, limit); // limit here, for example, may be two, but I see four copies concurrently
  }
编辑:
我现在认为这是系统其余部分的一个副作用…在副本启动后,队列被清除并重新初始化…因此,当新项目添加到重新初始化的队列中时,它们会立即启动,因为系统不知道是否有东西已交给userland并正在运行

所以,这是用户错误…PEBCAK!将解决方案更多地发布为一个警示故事:


上面的队列按设计工作,但我有一个端点,供调用服务器在必要时清除队列;问题是我使用了
kill()
并重新初始化队列,丢失了所有正在进行的作业及其回调的跟踪。一旦一个新项目进入新队列,它就会认为什么都没有发生,并产生一个新的复制过程。我通过使用
remove
清除队列而不是重新初始化来解决此问题。

您能演示如何将内容推送到队列上吗?我假设只有在使用返回的队列时调用一次这个调用。这是正确的。我正在努力找出问题所在,但我认为这是用户的错误。我认为我在错误的时间闪击了那个队列,任务已经发生了,创建了一个新的队列,它不知道正在进行的任务,因此它产生了N个新任务。如果它有效,我将把它作为一个答案添加,这样它就不是孤立的问题。谢谢