限制CPU NODE.JS操作以允许处理新呼叫

时间:2014-03-13 18:02:24

标签: node.js asynchronous express fork

我有一个expressJS应用程序接受一个请求,该请求导致执行1K到50K fs.link()动作。 (它甚至可能达到500K)。

发生这种情况时,请求(POST)没有被阻止。我立刻解雇了一个res.send(),让客户满意。

但是服务器然后“分叉”下面的工作,这需要去做所有发生异步的fs.links(),但是工作量(CPU,DISK等)意味着ExpressJS服务是在此期间对新请求的回应率不高。

是否有一些简单的方法(除了childProcess)来模拟将执行这些文件链接的低优先级线程的分叉?


Job.prototype.runJob = function (next) {
    var self = this;
    var max = this.files.length;
    var count = 0;
    async.each(this.files,
        function (file, step) {
            var src = path.join(self.sourcePath, file.path);
            var base = path.basename(src);
            var dest = path.join(self.root, base);
            fs.link(src, dest, function (err) {
                if (err) {
//                    logger.addLog('warn', "fs.link failed for file: %s", err.message, { file: src });
                    self.filesMissingList.push(src);
                    self.errors = true;
                    self.filesMissing++;
                } else {
                    self.filesFound++;
                }
                self.batch.update({ tilesCount: ++count, tilesMax: max, done: false });
                step(null);
            });
        },
        function (err) {
            self.batch.update({ tilesCount: count, tilesMax: max, done: true });
            next(null, "FalconView Linking of: " + self.type + " run completed");
        });
}

2 个答案:

答案 0 :(得分:1)

您可以使用webworker-threads模块,这有助于将CPU密集型任务转移到其他线程上。或者,你可以滥用cluster,但这确实是错误的工具。 (cluster模块更适合扩展Web服务,而不是用于执行密集型任务。)

答案 1 :(得分:0)

您可以尝试使用async.eachLimit而不是async.each。这样,您就可以控制在expressJS过程之前处理的迭代次数。