Nodejs批处理

一个概念上的问题

我有15个(例如)需要处理的文件。 但我不想一次处理一个。 相反,我想开始处理其中5个(任何5个顺序并不重要),只要这5个文件中的一个被处理另一个文件即可启动。 这个想法是最多5个文件同时处理,直到所有的文件被处理。

试图在Node中解决这个问题,但总的来说,我错过了这个想法是如何实现的

你可以通过下面的代码来做你想做的事情,但我很困惑你为什么要这样做?

function handle(file) { new Promise(function(resolve, reject) { doSomething(file, function(err) { if(err) reject(err); else resolve(); }); }) .then(function() { handle(files.shift()); }); } var files = [1, 2, ....., 15]; var max = 5; while(max--) { handle(files.shift()); } 

这种types的处理更准确的名称可能是“有限的并行执行”。 Mario Casciaro在他的书“Node.jsdevise模式”(从第77页开始)中介绍了这一点。该模式的一个用例是当您想要控制一组可能会导致负载过重的并行任务时。 下面的例子来自他的书。

有限的并行执行模式

 function TaskQueue(concurrency) { this.concurrency = concurrency; this.running = 0; this.queue = []; } TaskQueue.prototype.pushTask = function(task, callback) { this.queue.push(task); this.next(); } TaskQueue.prototype.next = function() { var self = this; while(self.running < self.concurrency && self.queue.length) { var task = self.queue.shift(); task(function(err) { self.running--; self.next(); }); self.running++; } } 

下面是一个模拟多个工作人员从中央工作队列读取的小示例: https : //jsfiddle.net/ctrlfrk/jsvyg69h/1/

 // Fake "work" that is simply a task that takes as many milliseconds as its value. const workQueue = [1000,4000,2000,4000,5000,3000,7000,1000,9000,9000,4000,2000,1000,3000,8000,2000,3000,7000,6000,30000]; const Worker = (name) => (channel) => { const history = []; const next = () => { const job = channel.getWork(); if (!job) { // All done! console.log('Worker ' + name + ' completed'); return; } history.push(job); console.log('Worker ' + name + ' grabbed new job:' + job +'. History is:', history); window.setTimeout(next, job); //job is just the milliseconds. }; next(); } const Channel = (queue) => { return { getWork: () => { return queue.pop(); }}; }; let channel = Channel(workQueue); let a = Worker('a')(channel); let b = Worker('b')(channel); let c = Worker('c')(channel); let d = Worker('d')(channel);