首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能使用NodeJS异步对作业进行排队

不能使用NodeJS异步对作业进行排队
EN

Stack Overflow用户
提问于 2014-04-24 09:16:03
回答 1查看 473关注 0票数 0

我跟踪了本教程异步文档,并提出了这段代码。

代码语言:javascript
复制
// 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);

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

代码语言:javascript
复制
//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被调用如下。

代码语言:javascript
复制
var urls = [url1, url2, url3, url4, url5, url6];
jobForCourses(urls);

它应该为每个urls创建一个作业,并一次执行4个作业。当一项工作完成后,它应该开始下一项工作。等等,直到队列中没有更多的作业。至少这就是告诉异步文档的原因:

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

但是,它将启动第四个作业,完成它们,而不实例化其他作业。当然,如果我将maxjobs设置为50,它将执行所有这些操作,但这不是我想要的。

编辑

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-24 09:40:03

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

代码语言:javascript
复制
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();
  })
}

您也可以在那里添加一些错误处理,例如。但这可能是一个起点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23264684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档