我正试图在 nodejs 中创建一个非阻塞的繁重计算。举这个例子(去掉其他东西):
http.createServer(function(req, res) {
console.log(req.url);
sleep(10000);
res.end('Hello World');
}).listen(8080, function() { console.log("ready"); });
你可以想象,如果我同时打开 2 个浏览器窗口,第一个会等待 10 秒,另一个会等待 20 秒,正如预期的那样。因此,知道回调在某种程度上是异步的,我删除了 sleep 并改为:
doHeavyStuff(function() {
res.end('Hello World');
});
函数定义简单:
function doHeavyStuff(callback) {
sleep(10000);
callback();
}
这当然行不通...我也尝试定义一个 EventEmitter 并注册到它,但是 Emitter 的主要功能在发出“完成”之前在里面有 sleep ,例如,所以一切都会再次运行 block 。
我想知道其他人是如何编写非阻塞代码的......例如 mongojs 模块或 child_process.exec 是非阻塞的,这意味着在代码中的某个地方,他们要么在另一个线程上 fork 一个进程,要么听它的事件。我怎样才能在一个例如有很长过程的方法中复制它?
我是否完全误解了 nodejs 范式? :/
谢谢!
更新:解决方案(有点)
感谢 Linus 的回答,确实唯一的方法是产生一个子进程,例如另一个 Node 脚本:
http.createServer(function(req, res) {
console.log(req.url);
var child = exec('node calculate.js', function (err, strout, strerr) {
console.log("fatto");
res.end(strout);
});
}).listen(8080, function() { console.log("ready"); });
calculate.js 可以花时间去做它需要做的事情并返回。这样,可以说多个请求会并行运行。
最佳答案
如果不使用 node 中的一些 IO 模块(例如 fs
或 net
),您不能直接这样做。如果您需要进行长时间运行的计算,我建议您在子进程(例如 child_process.fork
)或队列中进行。
关于node.js - NodeJs如何创建非阻塞计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546225/