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

node.js事件队列在哪里?

严易安
2023-03-14
问题内容

我已经在堆栈溢出中看到了类似的问题,但是没有一个问题完全陷入我所遇到的问题吗?我熟悉事件队列,它们如何工作以及如何实现。我是Node.js的新手,我想围绕Node.js的工作方式进行总结。

在c ++应用程序中,您将按照以下方式进行操作:

int main(){
    std::vector<Handler*> handlers;
    BlockingQueue queue = new BlockingQueue();
    //Add all the handlers call constructors and other such initialization

    //Then run the event loop
    while(true){
        Event e = queue.pop();

        for( std::vector<Handler>::iterator it = handlers.begin(); it != handlers.end(); ++it){
            *it.handle(e);
         }
     }
}

现在,在使用node.js的情况下,我可能会有一个看起来像main.js的主文件。

var http = require("http");
function main(){
    // Console will print the message
    console.log('Server running at http://127.0.0.1:8080/');
    var server = http.createServer(function (request, response) {

        // Send the HTTP header
        // HTTP Status: 200 : OK
        // Content Type: text/plain
        response.writeHead(200, {'Content-Type': 'text/plain'});

        // Send the response body as "Hello World"
        response.end('Hello World\n');
    });

    server.listen(8080);
    console.log('Main completed');
}

main();

我了解server.listen会将处理程序附加到事件队列,并且我们要添加类似于c ++示例的回调。

我的问题是。事件队列在哪里?它在javascript的某个地方还是内置在解释器中?还有相对于主事件循环如何调用主函数?


问题答案:

事件队列在哪里?它在javascript的某个地方还是内置在解释器中?

事件队列内置在承载Java解释器的操作环境中。它不是Java脚本本身的基础,因此它不是实际JS运行时的一部分。一个有趣的指示是这setTimeout()实际上不是ECMAScript的一部分,而是主机可以在Javascript环境中使用的东西。

围绕node.js中Javascript实现的系统会跟踪外部触发的事件(计时器,网络结果等),并且当Javascript忙于执行某些操作而发生外部事件时,它会触发关联的Javascript回调。如果Javascript忙于执行某事,则它将该事件排队,以便一旦Javascript不再忙时,它便可以触发队列中的下一个事件。

node.js本身libuv用于事件循环。您可以在这里阅读更多有关它的信息。它提供了一种多平台的方式来处理事件化的异步I
/ O,该方法是为node.js开发的,但也被其他一些项目使用。

这是一个可能也有帮助的相关答案:

在节点中等待回调时运行任意代码?

还有相对于主事件循环如何调用主函数?

当node.js启动时,将为其提供一个初始脚本文件来执行。它将脚本文件加载到内存中,解析其中的Javascript并执行它。在您的特定示例中,这将导致函数main被解析,然后将导致执行该函数以main()运行该函数

加载,解析和执行启动时传递给节点的脚本文件是给node.js的任务。它根本与事件队列无关。在某些node.js应用程序中,它运行该初始脚本,然后退出(完成其工作)。在其他node.js应用程序中,初始脚本启动计时器或服务器或类似的东西,这些东西将来会接收事件。在这种情况下,node.js会运行初始脚本以完成操作,但是由于现在已经创建了持久对象并且正在侦听事件(在您的情况下为服务器),因此nodejs不会关闭应用程序。它将保持运行状态,以便将来发生这些事件时可以接收这些事件。

这里缺少的一点是,您创建的服务器对象之类的东西使您可以注册一个回调,该回调在将来发生某些特定事件时将被调用一次或多次。此行为未内置到Javascript中。相反,实现这些对象或它们使用的TCP函数的代码必须维护已注册的回调列表,并且当这些事件发生时,它必须执行代码,以便调用适当的回调并传递适当的数据。在的情况下http.createServer(),它是nodejs
http库中的Javascript和本机代码的混合,使之有效。



 类似资料:
  • 问题内容: 我无法确切了解其功能。我以为自己了解了,但似乎无法复制自己的感觉: 虽然是循环的,我会寄过来几个请求,假设将排队几次身后有只在被排队完成。 如果我对它的工作方式是正确的,我认为结果将如下所示: 但这不是连续的: 我看到这是在执行之前返回的,这是预期的,但似乎是NEXT在行,而不是在队列的末尾,在所有请求的后面。这是它的工作方式吗?也许我只是不了解节点中事件队列的工作原理。而且请不要在这

  • 我刚才看到了三个方法的文档,当我们在工作线程中工作时,它们可以用来在UI线程中执行一段代码。方法有: > public final void runOnUIThread(Runnable action)-在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列中 public boolean post(Runnable act

  • 问题内容: 可以以标准方式执行此操作吗? 这是场景。 开始在EDT中执行一些昂贵的操作(EDT被阻止,直到昂贵的操作结束为止)。 在阻止EDT的同时,用户继续单击/拖动鼠标按钮。所有鼠标动作都记录在某处。 当EDT免费时(用昂贵的东西完成),它开始处理鼠标事件。 我在步骤3中想要的是丢弃堆积的鼠标事件。EDT释放后,任何新的鼠标事件都应按常规方式处理。 关于如何实现这一目标的任何想法。 PS:对于

  • 问题内容: 我正在尝试使用Python中的pygame为应用程序制定简单的控件。我已经掌握了基础知识,但是碰到了奇怪的墙:我正在使用箭头键来控制角色。如果我按住一个箭头键,然后按住另一个箭头键(以对角线方向移动),则角色将按预期方式移动。但是,如果我释放了所按下的 第二个 键(同时仍然按住第 一个 键),即使我仍然按住 第一个 键,角色也会停止移动。这是我的简单运动代码: 现在,我自然对此感到非常

  • 我们正在构建一个具有Node.js服务器和Express的架构体系。 在服务器中,发生的情况如下所示: 服务器接受来自客户端的传入HTTP请求 服务器生成两个文件(此操作可能“相对较长”,也就是0.1秒左右) 服务器将生成的文件(每个文件约20-200 KB)上载到外部CDN 服务器响应客户机,这包括CDN上文件的URI 目前,服务器正在为每个请求按顺序执行此操作,并且效果非常好(Node/Exp