node.js - NodeJs如何创建非阻塞计算

标签 node.js asynchronous nonblocking

我正试图在 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 模块(例如 fsnet),您不能直接这样做。如果您需要进行长时间运行的计算,我建议您在子进程(例如 child_process.fork)或队列中进行。

关于node.js - NodeJs如何创建非阻塞计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546225/

相关文章:

java - 为什么 Netty 客户端连接 future.operationComplete 在调用者线程中被调用?

asynchronous - 骡子3 : async reply w/reply on different main flow thread

node.js - 在被拒绝的 Promise 的 catch block 中 Mocha 测试失败

node.js - expressjs发帖时出现403 forbidden错误

javascript - 更改 Twitter 个人资料图片的机器人

javascript - Nodejs 串联运行函数

ruby - 如何在服务器/客户端上使用Ruby的write_nonblock/read_nonblock?

javascript - 如何使 Mongoose 不将空数组或对象字段插入文档中

java - springboot线程数不断增加

Django异步更新单页模板