关于Node.js中CPU密集型代码的困惑

时间:2011-04-19 16:44:59

标签: javascript events node.js serverside-javascript

关于“除了你的代码之外的所有内容并行运行”的问题,来自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是否足够?

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

提前道歉,因为不清楚。

3 个答案:

答案 0 :(得分:7)

实际上你不能“并行”运行它(除非你使用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);
        });
    }
}

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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