我关注this tutorial,async 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关于它的内容:
queue(worker,concurrency)
使用指定的并发性创建队列对象。任务添加到 队列是并行处理的(直到并发限制)。如果 所有工人都在进行中,任务排队等到一个人就成了 可用。一旦工人完成任务,该任务的回调就是 调用。
但是,它会启动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
答案 0 :(得分: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();
})
}
您还可以在那里添加一些错误处理,即。但这可能是一个起点。