Node.js移动繁重的CPU绑定任务

时间:2016-09-24 00:41:52

标签: javascript node.js performance

我有一个函数可以根据传递的参数递归调用它。此函数最后调用另一个函数可能非常占用CPU,因为它处理一组N个对象并执行繁重的string操作。当N足够大时,它会减慢应用程序的速度。使用计时器将string操作移动到事件循环并不起作用,因为它仍然会使应用程序执行此循环后执行代码的速度变慢。我想过使用child_process生成另一个节点实例,但我不认为这是一个很好的解决方案,因为根据配置传递给第一个函数,这个函数可以多次调用,这意味着 - 产生了很多node.js进程。

这是一个说明问题的代码示例:

function Fun(opts) {
    // depending on opts we call HeavyCPU alot
    while (...) {
        var set = ...;
        HeavyCPU(set)
    }
}

function HEAVYCPU(var set) {
    // Heavy CPU task - string manipulations
}

module.exports = Fun;

如果我以这种方式生成子进程:

// fun.js
var cp = require('child_process');
function Fun(opts) {
    // depending on opts we call HeavyCPU alot
    while (...) {
        var set = ...;
        var child = cp.fork('./heavycpu', set);
    }
}

module.exports = Fun;

// heavycpu.js
function HEAVYCPU(var set) {
    // Heavy CPU task - string manipulations
}

依赖于opts的while语句,我仍然可以得到许多衍生进程。

在这种情况下我该怎么办?

1 个答案:

答案 0 :(得分:0)

为防止多个子进程产生,您可以格式化参数并在HEAVYCPU(您的子任务)中调用while进程。

fun.js

var cp = require('child_process');
function Fun(opts) {
    var arguments = processOptions(opts) //processOptions is just an example
    var child = cp.fork('./heavycpu', arguments );
}

module.exports = Fun;

heavycpu.js

function HEAVYCPU(var set) {
    while(...) {
      //Here goes the actual processing code
    }
}

如果您不希望混合使用HEAVYCPU代码并迭代参数,则可以创建一个包装函数(然后在子进程中调用),该函数处理提供的参数,然后调用HEAVYCPU

您还可以将每个参数发送到您的流程:

  

child_process.fork()方法是child_process.spawn()的特例,专门用于生成新的Node.js进程。与child_process.spawn()一样,返回一个ChildProcess对象。返回的ChildProcess将内置一个额外的通信通道,允许消息在父级和子级之间来回传递。有关详细信息,请参阅child.send()。

Child Processes Documentation