关于Node.js中CPU密集型代码的混淆

一个关于“从一个新的Node.js开始,所有东西都是并行运行的问题”的问题。 这是一个明显的人为的例子,但是假设我想创build一个包含函数factorize()的math库,其行为如下:

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

这怎么写才能“平行运行”呢?

我一直在看这个库中的parsing代码,作为一个例子,可能需要一些处理时间。 代码的正文被认为是“你的代码”,还是这个“并行运行”?

如果不是:在编写factorize()时我需要做什么,以便它也是非阻塞的/像客户端一样行事? 使用EventEmitter是否足够?

如果是这样的话:我最好的select仍然是使用这个问题中build议的subprocess ?

提前道歉不清楚。

实际上你不能像“并行”(除非你使用工作模块 )那样运行它,因为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); }); } } 

要写非阻塞代码,你必须做消息传递。

要做消息传递,你必须打开一个stream,并通过它传递消息。 这涉及与其他进程交谈或与subprocess交谈。

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

所有的JS代码不能并行运行。 从来没有同时执行多个function。 CPU密集的代码将使你的程序无法做别的事情,直到代码结束。

我build议你用setTimeout来分割你的代码,或者在一个单独的过程中完成你的工作。 但是这必须是非常密集的代码;)