Node can handle this. You just need to write the logic to not allow more than X child processes be running at once. Here is some simple code to give a rough idea. Please don't block your node process while waiting for child processes.
var queue = []; // or if the queue gets huge, use a smarter queue. Array.prototype.shift can get expensive in the hundreds
var running = 0;
var maxRunning = 10;
function doWork(options, callback) {
if (running >= maxRunning) {
queue.push({options:options,callback:callback});
return;
}
running++;
doRealWork(options, function () {
running--;
checkQueue();
return callback.apply(this, arguments);
});
}
function checkQueue() {
while (running < maxRunning) {
var next = queue.shift();
doWork(next.options, next.callback)
}
}