NodeJs如何创建一个非
我试图在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个。 所以,在知道回调是异步的情况下,我去掉了睡眠并把它改为:
doHeavyStuff(function() {
res.end('Hello World');
});
功能简单定义:
function doHeavyStuff(callback) {
sleep(10000);
callback();
}
这当然不起作用......我也试图定义一个EventEmitter并注册它,但是发射器的主要功能在发射完成之前已经睡眠了,例如,所有的事情都会运行阻塞。
我在这里想知道其他人如何编写非阻塞代码......例如mongojs模块或者child_process.exec是非阻塞的,这意味着代码中的某处可以在另一个线程上分叉进程并听取其中的内容事件。 我怎么能在metod中复制这个例子,比如有一个漫长的过程呢?
我完全误解了nodejs范式吗? :/
谢谢!
更新:解决方案(有点)
感谢Linus的回答,实际上唯一的方法是产生一个子进程,比如另一个节点脚本:
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可以花时间做它所需要的并返回。 这样,多个请求可以并行运行。
如果不使用节点中的某些IO模块(例如fs
或net
),则无法直接执行此操作。 如果你需要做一个长时间运行的计算,我建议你在一个子进程(比如child_process.fork
)或者一个队列中这样做。
如果您可以将计算分割为块,那么您可以安排执行程序每N秒轮询一次数据,然后在M秒后再次运行。 或者专门为那个任务产生专门的孩子,这样主线程就不会阻塞。
链接地址: http://www.djcxy.com/p/1511.html