调节CPU NODE.JS操作以允许处理新的调用

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

请求(POST)不会在这种情况下被阻止。 我马上开始res.send(),使客户感到高兴。

但是,服务器然后“分叉”下面的工作,这需要去做所有的fs.links()发生asynchronous,但工作量(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"); }); } 

您可以使用webworker-threads模块,这对于将CPU密集型任务转移到其他线程上很有用。 另外,你可能会滥用cluster ,但这实际上是工作的错误工具。 ( cluster模块对于扩展Web服务真的更好,而不是用于执行密集型任务。)

您可以尝试使用async.eachLimit而不是async.each。 通过这种方式,您可以控制expressJS进程之前处理的迭代次数。