Node.js 批处理
一点概念上的问题 我有15个(例如)文件需要处理。但我不想一次处理一个。相反,我想开始处理其中的5个(任何5个顺序都不重要),只要处理了这5个文件中的一个,就可以启动另一个。其想法是在处理所有文件之前,最多同时处理5个文件Node.js 批处理,node.js,batch-processing,Node.js,Batch Processing,一点概念上的问题 我有15个(例如)文件需要处理。但我不想一次处理一个。相反,我想开始处理其中的5个(任何5个顺序都不重要),只要处理了这5个文件中的一个,就可以启动另一个。其想法是在处理所有文件之前,最多同时处理5个文件 试图在Node中解决这个问题,但总的来说,我不知道如何实现它你可以通过下面的代码做你想做的事情,但我不明白你为什么要这样做 function handle(file) { new Promise(function(resolve, reject) {
试图在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());
}
下面是一个模拟多个工作人员从中心工作队列读取数据的小示例:
对于这种类型的处理,更准确的名称可能是“有限并行执行”。Mario Casciaro在他的书Node.js Design Patterns(从第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++;
}
}
函数任务队列(并发){
this.concurrency=并发;
此参数为0;
this.queue=[];
}
TaskQueue.prototype.pushTask=函数(任务,回调){
this.queue.push(任务);
这个。下一个();
}
TaskQueue.prototype.next=函数(){
var self=这个;
while(self.running
我现在无法给出完整答案,但请查看ChildProcess API。你基本上想启动5个子进程,并在它们需要时使用主进程向它们提供工作。除非你说的是在单线程中完成所有这些工作,否则我不确定我是否看到了好处。我认为你需要给我们一些想法(最好是代码)关于您试图对这些文件进行何种处理。它是CPU密集型还是磁盘密集型?换句话说,您需要使用多个CPU,还是只想最大限度地利用JS主线程?@david:使用单线程还是有好处的,因为进程大部分时间都在等待来自磁盘的I/O。处理过程是读取文件,并使用数据库中的数据丰富它们。数据库选择是有点讨厌,在一个大的数据和我试图发挥良好的(尽我所能)与数据库之上。不希望一次运行15个选择,但也不希望一次处理一个选择。
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++;
}
}