当前位置: 首页 > 面试题库 >

NodeJs如何创建非阻塞计算

詹弘毅
2023-03-14
问题内容

我正在努力使自己在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是非阻塞的,这意味着在代码中的某个地方,他们在另一个线程上派生了一个进程并侦听其进程事件。我该如何复制这个方法,例如要花费很长时间?

我是否完全误解了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模块(例如fsnet),则无法直接执行此操作。如果您需要长时间运行计算,建议您在子进程(例如child_process.fork)或队列中进行。



 类似资料:
  • 问题内容: 基本上,我有一个URL,当发布新消息时,该URL在聊天室中流xml更新。我想将URL转换为InputStream并继续读取它,只要保持连接并且没有发送Thread.interrupt()。我遇到的问题是,当有内容要从流中读取时,BufferedReader.ready()似乎不正确。 我正在使用以下代码: 当我运行代码并将某些内容发布到聊天室时,buf.ready()永远不会变为tru

  • 本文向大家介绍轻松创建nodejs服务器(8):非阻塞是如何实现的,包括了轻松创建nodejs服务器(8):非阻塞是如何实现的的使用技巧和注意事项,需要的朋友参考一下 这节我们来了解一下nodejs实现非阻塞操作的方法。 我们先来修改一下 start的处理程序: 这段代码,创建了一个新的变量content(初始值为“empty”),执行“ls -lah”命令,将结果赋值给content,最后将co

  • 我想用Tkinter创建一个非阻塞消息窗口。这是为了在另一个函数正在等待答复时显示等待消息。收到回复后,窗口可自动关闭。我设法在网上找到了一些信息,我做了以下工作: 当我将其作为主脚本执行时,这运行良好,但是当我在得到以下错误RuntimeError之后想要使用Tkinter运行另一个gui应用程序时:主线程不在主循环中 另外,当我在App.destroy()之后运行另一段代码时。然后应用程序窗口

  • 问题内容: 我目前正在尝试学习nodejs,而我正在做的一个小项目正在编写一个API,以控制一些联网的LED灯。 控制LED的微处理器具有处理延迟,我需要将发送给微控制器的命令间隔至少100毫秒。在C#中,我习惯于仅调用Thread.Sleep(time),但在node中没有找到类似的功能。 我已经找到了在节点中使用setTimeout(…)函数的几种解决方案,但是,这是异步的并且不会阻塞线程(这

  • 本文向大家介绍轻松创建nodejs服务器(9):实现非阻塞操作,包括了轻松创建nodejs服务器(9):实现非阻塞操作的使用技巧和注意事项,需要的朋友参考一下 我们要将response对象(从服务器的回调函数onRequest()获取)通过请求路由传递给请求处理程序。随后,处理程序就可以采用该对象上的函数来对请求作出响应。 我们先对server.js做出修改: 我们将response对象作为第三个

  • 非阻塞 IO 仅对在 Servlet 和 Filter(2.3.3.3节定义的,“异步处理”)中的异步请求处理和升级处理(2.3.3.5节定义的,“升级处理”)有效。否则,当调用 ServletInputStream.setReadListener 或ServletOutputStream.setWriteListener 方法时将抛出IllegalStateException。为了支持在 Ser