【问题标题】:How does NodeJs handle so many incoming requests, does it use a thread pool?NodeJs 是如何处理这么多传入请求的,它使用线程池吗?
【发布时间】:2011-11-09 03:41:30
【问题描述】:

当请求进入nodejs服务器时,它如何处理请求?

我知道它有不同的处理请求的方式,因为它不会为每个请求生成一个新线程(或者我猜它也不使用传统的线程池)。

谁能向我解释一下幕后发生了什么,Linux 的风格在这里重要吗?

【问题讨论】:

    标签: multithreading node.js


    【解决方案1】:

    不,它执行异步 IO。只有一个线程阻塞,直到某处发生某事,然后它处理该事件。这意味着一个进程中的一个线程可以服务多个并发连接。有点像

    endless loop {
      event = next_event()
      dispatch_event(event)
    }
    

    唯一的例外是文件系统,它在后台使用线程池。

    【讨论】:

    • 所以你的意思是它实际上是序列化的?当一个请求“休眠”时,它如何唤醒并告诉线程启动?
    • @codecompleting:你可以告诉操作系统在数据进入套接字时通知你。
    • 让NodeJS多线程有什么好处吗?或者它基本上可以完全利用一个线程的CPU吗? NodeJS可以使用多核吗?
    • @MikeChristensen:您可以使用 node 创建多个进程并使用所有内核,但 node 并不是真正为 CPU 密集型的东西而设计的。如果您需要多进程网络服务器,您可以使用内置的“集群”功能,它可以让您运行任意数量的程序副本,并将传入连接传递给随机进程。
    • node ja 如何存储mamy事件?他们坐在哪里?如何衡量他们的数量?
    【解决方案2】:

    Node 告诉操作系统(通过epollkqueue/dev/pollselect)它应该在建立新连接时得到通知,然后它进入睡眠状态。如果有人新连接,那么它会执行回调。每个连接只是一个小的堆分配

    它是“事件驱动”的,它以异步方式处理 IO(非阻塞 I/O)。它在内部执行epollkqueue/dev/pollselect 处理所需的线程,但对于作为用户/客户端的您来说,它是绝对透明的。

    例如epoll 并不是真正的线程池,而是操作系统的 I/O 事件通知工具,node.js 位于其之上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-19
      • 2012-03-08
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 2014-11-16
      • 2016-02-11
      相关资源
      最近更新 更多