关于“除了你的代码之外的所有内容并行运行”的问题,来自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吗?
提前道歉,因为不清楚。
答案 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拆分代码,或者在单独的进程中完成工作。但这必须是非常密集的代码;)