【问题标题】:Can't queue jobs using NodeJS async无法使用 NodeJS 异步对作业进行排队
【发布时间】:2014-06-09 11:44:56
【问题描述】:

我关注了this tutorialasync documentation 并想出了这段代码。

// ASYNC JOBS
var async             = require('async'),
    spawn             = require('child_process').spawn
    maxjobs           = 4;

function setup_R_job(opts,done)
{
  log('starting '+opts.params.pop());
  var params = opts.params;
  delete opts['params'];
  var R = spawn('phantomjs', params, opts);
  R.on('exit',function(code)
  {
    log('got exit code: '+code)
    return null;
  })
  return null;
}
var course_queue=async.queue(setup_R_job, maxjobs);

我使用这个函数来实例化作业。

//instaciante jobs
var jobForCourses = function(urls)
{
  for (var i = urls.length - 1; i >= 0; i--) {
    var opts = {  cwd: __dirname,
                  env: process.env,
                  params: ['../getCourseLinks.js','--course']
               };
    opts.params.push(urls[i]);
    log("queueing: "+opts.params.join(' '));
    course_queue.push(opts);
  };
};

jobForCourses 如下调用。

var urls = [url1, url2, url3, url4, url5, url6];
jobForCourses(urls);

它应该为每个 url 创建一个作业,并一次执行 4 个作业。完成一项工作后,应该开始下一项工作。以此类推,直到队列中没有更多作业。 至少这就是告诉async documentation 的原因:

队列(工作者,并发)

创建具有指定并发性的队列对象。添加到的任务 队列是并行处理的(直到并发限制)。如果 所有工人都在进行中,任务排队,直到一个成为 可用的。一旦工作人员完成一项任务,该任务的回调是 调用。

但是,它会启动前 4 个作业,然后完成它们,并且不实例化其他作业。 当然如果我将maxjobs设置为50,它会执行所有这些,但这不是我想要的。

编辑

如果它可以帮助理解,我会得到以下输出:

queueing: ../getCourseLinks.js --course /courses/url1
queueing: ../getCourseLinks.js --course /courses/url2
queueing: ../getCourseLinks.js --course /courses/url3
queueing: ../getCourseLinks.js --course /courses/url4
queueing: ../getCourseLinks.js --course /courses/url5
queueing: ../getCourseLinks.js --course /courses/url6
queueing: ../getCourseLinks.js --course /courses/url7
queueing: ../getCourseLinks.js --course /courses/url8
queueing: ../getCourseLinks.js --course /courses/url9
...
starting /courses/url1
starting /courses/url2
starting /courses/url3
starting /courses/url4
got exit code: 0
got exit code: 0
got exit code: 0
got exit code: 0

【问题讨论】:

  • 您不将getCourseLinks 视为常规Node 模块有什么特殊原因吗?
  • getCourseLinks 是一个 phantomjs 脚本。无法使用 Node 执行。

标签: javascript node.js jobs child-process


【解决方案1】:

您需要在进程完成后调用done。试试这个:

function setup_R_job(opts,done) {
  log('starting '+opts.params.pop());
  var params = opts.params;
  delete opts['params'];
  var R = spawn('phantomjs', params, opts);
  R.on('exit',function(code)
  {
    log('got exit code: '+code)

    done();
  })
}

您还可以在那里添加一些错误处理,即。但这可以作为一个起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2015-11-03
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2012-12-31
    相关资源
    最近更新 更多