14

来自 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);

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

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

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

如果是这样:我最好的选择仍然是按照这个问题的建议使用子进程吗?

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

4

3 回答 3

7

实际上,您不能“并行”运行它(除非您使用工作模块),因为 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);
        });
    }
}
于 2011-04-19T17:00:31.583 回答
3

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

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

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

于 2011-04-19T17:11:54.797 回答
1

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

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

于 2011-04-19T17:00:59.747 回答