如果node.js是单线程的,那么server.listen()为什么返回?

喘息

我熟悉c ++和Java中基于事件的系统。我试图学习node.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); //Why is this not blocking
    console.log('Main completed');

    //main loop here prevents other stuff from working
}

main();

在像Java或C这样的语言中,我期望两件事。server.listen都提供了一个事件循环,它将导致server.listen永不返回。或者server.listen产生一个新线程,并在返回的新线程中运行事件循环。然后它将调用console.log,然后返回并关闭该程序。

为了测试这一点,我还在console.log下面添加了一个忙循环,如下所示。

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); //Why is this not blocking
    console.log('Main completed');

    while(true){
        console.log('hi');
    }
}

main();

Server.listen立即返回,然后按预期卡在繁忙循环中。我的浏览器无法连接到服务器,这是预期的。

如果我删除了繁忙的循环并回到原始代码,请执行console.log('Maincomplete');。当执行而不是退出程序时,主线程将跳回事件循环。

这是如何运作的。主线程返回后,为什么主线程跳回到服务器代码中?

编辑:我认为决议事件队列在主函数中不存在,但它在哪里?它是什么拥有的?什么时候主函数引用它?

凯文·B

认为http.createServer(handler)浏览器server.listen(port)有点相似someElement.addEventListener('click', handler)

运行时someElement.addEventListener('click', handler),它将绑定事件侦听器,handler当单击事件被触发时,该事件侦听器将发送到回调队列someElement

http.createServer(handler)server.listen(port)以非常相似的方式工作结合http.createServer(handler)返回eventEmitter,并server.listen(port)告诉node.js当在给定端口上收到http请求时,应触发此事件。因此,当请求进入时,事件被触发,并handler被推送到回调队列。

至此,仅是事件循环调用堆栈和回调队列如何交互的一个简单问题。调用堆栈是函数当前执行的栈,该回调队列是回调等待执行的集合,而事件循环就是回调拉断的回调队列,并把它们发送到调用堆栈

因此,从某种意义上说,事件循环可以使一切正常进行,但是,如果您通过在一个回调中使用同步无限循环来阻止调用栈为空,则事件循环将永远不会再次运行,并且回调也永远不会执行,从而导致损坏/无响应的应用程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果Node.js是单线程的,那么Rails是什么?

来自分类Dev

Node.js是单线程还是非单线程?

来自分类Dev

Node.js-单线程,非阻塞?

来自分类Dev

Node.js多线程与Node.js单线程

来自分类Dev

Node.JS中的单线程事件循环与多线程非阻塞工作者

来自分类Dev

Node.JS中的单线程事件循环与多线程非阻塞工作者

来自分类Dev

为什么我的多线程比单线程慢?

来自分类Dev

如何在node.js中创建后台单线程FIFO作业队列

来自分类Dev

如何在node.js中创建后台单线程FIFO作业队列

来自分类Dev

多核CPU与Java(Tomcat)上的单线程Node.js

来自分类Dev

为什么我的ASP.NET网站是单线程的?

来自分类Dev

如果扩展是单线程的,是否需要 Python GIL

来自分类Dev

为什么节点server.listen不返回外壳

来自分类Dev

Hibernate Session是单线程的意味着什么?

来自分类Dev

Node.js是单线程的,这是否意味着我们不能在不同的线程中运行多个Node.js?

来自分类Dev

为什么多线程版本需要与单线程版本相同的时间?

来自分类Dev

为什么我的单线程hello world应用程序使用22个OS线程?

来自分类Dev

为什么在使用pthread的Ubuntu中单线程比多线程快?

来自分类Dev

为什么多线程的for循环不如单线程的性能好?

来自分类Dev

在 Node.js 中,如果 v8 运行您的 JavaScript,那么 Node.js Api 由什么运行?

来自分类Dev

为什么Java单线程程序使用futex和clone系统调用

来自分类Dev

为什么在Servlet的情况下需要实现单线程模型?

来自分类Dev

为什么GTX Titan上的cublas比单线程CPU代码慢?

来自分类Dev

为什么单线程应用程序占用多核并限制cpu使用率

来自分类Dev

为什么单线程进程有多个 Sidekiq 客户端连接?

来自分类Dev

为什么添加并行 for 循环会减慢单线程循环的速度?

来自分类Dev

如果JavaScript是单线程的,如何测量多个Ajax调用的时间

来自分类Dev

Haskell中的并发性:如果单线程但设置了+ RTS -N怎么办

来自分类Dev

nodejs单线程?如果有大量并发请求,它如何工作

Related 相关文章

  1. 1

    如果Node.js是单线程的,那么Rails是什么?

  2. 2

    Node.js是单线程还是非单线程?

  3. 3

    Node.js-单线程,非阻塞?

  4. 4

    Node.js多线程与Node.js单线程

  5. 5

    Node.JS中的单线程事件循环与多线程非阻塞工作者

  6. 6

    Node.JS中的单线程事件循环与多线程非阻塞工作者

  7. 7

    为什么我的多线程比单线程慢?

  8. 8

    如何在node.js中创建后台单线程FIFO作业队列

  9. 9

    如何在node.js中创建后台单线程FIFO作业队列

  10. 10

    多核CPU与Java(Tomcat)上的单线程Node.js

  11. 11

    为什么我的ASP.NET网站是单线程的?

  12. 12

    如果扩展是单线程的,是否需要 Python GIL

  13. 13

    为什么节点server.listen不返回外壳

  14. 14

    Hibernate Session是单线程的意味着什么?

  15. 15

    Node.js是单线程的,这是否意味着我们不能在不同的线程中运行多个Node.js?

  16. 16

    为什么多线程版本需要与单线程版本相同的时间?

  17. 17

    为什么我的单线程hello world应用程序使用22个OS线程?

  18. 18

    为什么在使用pthread的Ubuntu中单线程比多线程快?

  19. 19

    为什么多线程的for循环不如单线程的性能好?

  20. 20

    在 Node.js 中,如果 v8 运行您的 JavaScript,那么 Node.js Api 由什么运行?

  21. 21

    为什么Java单线程程序使用futex和clone系统调用

  22. 22

    为什么在Servlet的情况下需要实现单线程模型?

  23. 23

    为什么GTX Titan上的cublas比单线程CPU代码慢?

  24. 24

    为什么单线程应用程序占用多核并限制cpu使用率

  25. 25

    为什么单线程进程有多个 Sidekiq 客户端连接?

  26. 26

    为什么添加并行 for 循环会减慢单线程循环的速度?

  27. 27

    如果JavaScript是单线程的,如何测量多个Ajax调用的时间

  28. 28

    Haskell中的并发性:如果单线程但设置了+ RTS -N怎么办

  29. 29

    nodejs单线程?如果有大量并发请求,它如何工作

热门标签

归档