当前位置: 首页 > 知识库问答 >
问题:

单线程事件驱动的webserver(如node.js)如何在套接字级别工作?

郜联
2023-03-14

所以我经常从朋友那里听到Node.js是如何使用单个线程来完成所有工作的。我认为这意味着它通过一个等待“accept”方法的循环线程接受新的套接字连接(像大多数web服务器一样),然后它不是将接收到的套接字委托给一个新线程来处理,而是以某种方式获得一个线程来处理所有的连接。

但每个人都告诉我情况并非如此,它实际上是事件驱动的--这样事情只会按需发生(即来自客户机的请求)。

但是,在使用过最低级别的套接字之后,我了解到,通常如果您想要立即响应请求,您需要有一个线程坐在那里并阻止它正在等待的套接字的读操作。

所以我的问题是,像node这样的东西是如何实现这一点的?是否有一个后台线程不断地检查后台的每个“事件”套接字是否先后传入数据,并在出现事件时做出反应(即催生一个新线程来处理它)?

节点实际上是单线程的,还是我曲解了单线程的含义?

共有1个答案

狄宏大
2023-03-14

根据我的理解,NodeJS的事件循环是单线程的。

还有其他线程在幕后被控制,用于基本所有的IO操作-套接字、文件、TCP等。这些线程由NodeJS可执行文件管理,它们的数量会根据需要增长和缩小,并且在Node中进行“系统级”调用。当前,我的node进程报告MacOSX活动监视器中有8个线程。

因此,IO线程和其他重要的系统级别的事情都发生在幕后,我们不必太担心。我们确实需要担心的是主事件循环,我们的单线程,因为它一次只能处理一个事件。

我从一篇失去链接的文章中借鉴了这个思想,但执行事件循环的主要节点进程是“King Thread”,它向从属线程(IO套接字、文件、TCP等)传递方向。King线程一次只需要处理一个事件,服务线程排列起来让King线程执行它们的特定事件。如果该从属线程需要其他地方的信息(如“回调”),则King线程将停止处理该从属线程,并移到事件队列中的下一个从属线程。仆人线程可以继续工作或收集信息,而国王线程正在处理王国的所有事件。

这样,王线程一次只需要处理一个事件,而且速度非常快,因为他是一个高效的王线程。如果某个从属线程说得他耳边风,事件行中的所有其他从属线程必须等待轮到他们。但是,任何为King线程收集信息的服务线程(比如拉入HTTP请求或推出DB查询)都可以继续全速工作,直到它获得King线程的信息为止,此时他跳入King线程处理其事件的队列。

希望能有所帮助:)

 类似资料:
  • 本文向大家介绍Node.js事件驱动,包括了Node.js事件驱动的使用技巧和注意事项,需要的朋友参考一下 Node.js事件驱动实现概览 虽然在ECMAScript的标准里并没有(也没有必要)明确规定“事件”,但是在浏览器中,事件作为一个极为重要的机制,给予JavaScript响应用户操作与DOM变化的能力;在Node.js中,异步事件驱动模型则是其高并发能力的基础。 学习JavaScript也

  • 问题内容: 在人们的帮助下,我能够获得以下简单的GUI倒数的工作代码(它仅显示一个倒数秒的窗口)。我的这段代码的主要问题是东西。 据我了解,它将任务发送到事件分发线程(EDT),然后EDT在“可以”时执行该任务(无论如何)。 那正确吗? 据我了解,代码的工作方式如下: 在方法中,我们用来显示窗口(方法)。换句话说,显示窗口的代码将在EDT中执行。 在该方法中,我们还启动,计数器(通过构造)在另一个

  • 问题内容: 我正在尝试了解Redis的基础知识。Redis是无处不在的一种,它是使事情变得原子化的单线程,但是我无法想象这在内部是如何工作的。 如果它是IO绑定的应用程序(例如Node.js),则我们不设计服务器单线程,该线程在启动IO操作后释放了另一个请求的空间,并在IO操作完成后将数据返回给客户端(提供并发性)。但是在Redis的情况下所有数据都可以在主内存中使用,我们根本就不会做IO操作。那

  • 我正在努力了解Redis的基础知识。其中一个不断出现的地方是,Redis是单线程的,使事物原子化。但我无法想象这是如何在内部工作的。我有以下疑问。 如果是IO绑定的应用程序(如node.js),那么我们不是设计一个服务器单线程吗?线程在发起IO操作后为另一个请求提供空闲,并且在IO操作完成后将数据返回给客户机(提供并发)。但是在redis的情况下,所有的数据都在主存中可用,我们根本不做IO操作。那

  • 本文向大家介绍Node.js中的事件驱动编程详解,包括了Node.js中的事件驱动编程详解的使用技巧和注意事项,需要的朋友参考一下 在传统程编程模里,I/O操作就像一个普通的本地函数调用:在函数执行完之前程序被堵塞,无法继续运行。堵塞I/O起源于早先的时间片模型,这种模型下每个进程就像一个独立的人,目的是将每个人区分开,而且每个人在同一时刻通常只能做一件事,必须等待前面的事做完才能决定下一件事做什

  • 问题内容: Node.JS的最大优点是它具有非阻塞性。它是单线程的,因此不需要为每个新的传入连接生成新的线程。 在事件循环(实际上是单线程)的后面,有一个“非阻塞工作程序”。这个东西不再是单线程的,所以(据我了解),它可以为每个任务产生一个新线程。 也许我误会了一些东西,但是优势到底在哪里。如果要处理的任务很多,那么“非阻塞工作”会不会变成“阻塞工作人员”? 谢谢克里斯蒂安 问题答案: 您需要阅读