簡體   English   中英

節流CPU NODE.JS操作以允許處理新調用

[英]Throttle CPU NODE.JS action to allow new calls to be processed

我有一個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");
        });
}

您可以使用webworker-threads模塊,該模塊非常適合將CPU密集型任務旋轉到其他線程上。 另外,您可能會濫用cluster ,但這實際上是錯誤的工具。 cluster模塊確實非常適合於擴展Web服務,而不適合於執行繁重的任務。)

您可以嘗試使用async.eachLimit而不是async.each。 這樣,您可以控制在expressJS處理之前要處理的迭代次數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM