【问题标题】:Confusion about CPU intensive code in Node.js对 Node.js 中 CPU 密集型代码的困惑
【发布时间】:2011-08-08 20:28:16
【问题描述】:

Node.js 新手提出的关于“除了您的代码之外的所有内容都并行运行”的问题。这显然是一个人为的例子,但假设我想创建一个包含函数factorize() 的数学库,其行为如下:

var http = require('http');
http.createServer(function (req, res) {
  myMath.factorize(some_big_number,function(factors) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end(JSON.stringify(factors));
  }
}).listen(8000);

如何编写它以使其“并行运行”?

我一直在查看来自 this library 的解析代码作为可能需要一些处理时间的示例。 code 的主体是否被视为“您的代码”,还是“并行运行”?

如果不是:在编写factorize() 时我需要做什么才能使其也像客户端一样无阻塞/行为?使用 EventEmitter 就足够了吗?

如果是这样:我的最佳选择仍然是按照this question 中的建议使用child processes 吗?

如有任何不明确之处,请提前道歉。

【问题讨论】:

  • 我没有答案,但我理解这个问题,所以我想这对大多数人来说已经足够清楚了。 :)

标签: javascript events node.js serverside-javascript


【解决方案1】:

实际上,您不能“并行”运行它(除非您使用 workers module),因为 node.js 中的 JavaScript 是在单线程中执行的,但您可以将单线程拆分为更小的部分。例如process.nextTick,因此当 CPU 以较小的块而不是长时间运行的代码执行代码时,它也会有小的中断来运行其他东西。

myLongRunningCode(callback){
    do_a_piece_of_the_work();
    if(ready){
        callback();
    }else{
        // give the CPU a small break to do other things
        process.nextTick(function(){
            // continue working
            myLongRunningCode(callback);
        });
    }
}

【讨论】:

  • 我还建议在递归函数或循环中使用process.nextTick,这样您就可以有很多小中断。
【解决方案2】:

要编写非阻塞代码,您必须进行消息传递。

要进行消息传递,您必须打开一个流并通过它传递消息。这包括与其他进程或子进程交谈。

您可以在节点中创建子进程来为您完成繁重的工作,或者您可以创建一个 tcp/web 服务来为您完成繁重的工作。只需让节点将消息传递给它们,然后在外部进程完成繁重的工作时将数据发送到您的响应中。

【讨论】:

    【解决方案3】:

    您的所有 JS 代码都不能并行运行。永远不会有多个函数同时执行。 CPU 密集型代码会使您的程序在此代码结束之前无法执行其他操作。

    我建议您使用 setTimeout 拆分代码或在单独的进程中完成您的工作。但这一定是非常密集的代码;)

    【讨论】:

    • 他说的是服务器和响应请求,所以它是并行运行的。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多