我有一个ExpressJS应用程序,该应用程序接受了导致1K至50k fs.link()操作的请求。(甚至可能达到500k)。
在发生这种情况时,请求(帖子)不会被持有。我立即发射res.Send(),这使客户开心。
但是服务器然后"叉"下面的作业,这需要去做所有确实发生异步的fs.links(),但是工作量(CPU,磁盘等)表示ExpressJS服务是在此期间,对新请求的响应不是很敏感。
是否有一些简单的方法(除了儿童程序之外)模拟将执行这些文件链接的低优先级线程的分叉?
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");
});
}
您可以使用webworker-threads
模块,这非常适合将CPU密集型任务旋转到其他线程上。另外,您可以滥用cluster
,但这确实是工作的错误工具。(cluster
模块确实更好地用于扩展Web服务,而不是执行密集任务。)
您可以尝试使用async.eastlimit而不是async.each。这样,您可以控制在ExpressJS流程之前处理多少次迭代。