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

所以我不断地从朋友那里听到node.js如何使用单个线程完成所有的事情。 因此,我认为这意味着它通过循环线程接受新的套接字连接,等待一个“接受”方法(像大多数Web服务器),然后而不是委托它接收的套接字到一个新的线程处理,它以某种方式得到一个单线程来处理所有的连接。

每个人都告诉我,事实并非如此,事实上它是事件驱动的 – 所以事情只发生在需求上(即来自客户端的请求)。

但是,在最低级别的套接字上工作,我明白,通常如果你想立即回应请求,你需要有一个线程坐在和阻塞从它正在等待的套接字读取。

所以我的问题是,节点如何实现这个? 是否有一个后台线程不断检查后台中的每个“事件”套接字连续传入的数据,并在出现事件(即产生一个新线程处理它)时作出反应?

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

据我所知, NodeJS事件循环是单线程的

基本上任何IO操作(套接字,文件,TCP等等)在幕后都有其他线程控制。这些线程由NodeJS可执行文件pipe理,其数量根据需要增长和缩小,并且在Node中进行“系统级”调用。 目前,我的node进程在MacOSX活动监视器中报告8个线程。

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

比喻

我借用了一个我失去了链接的文章,但是执行事件循环的主节点进程是向主线程(IO-套接字,文件,TCP等)传递方向的“国王线程”。 )。 国王线一次只能处理一个事件,而仆人线则排队让国王线执行他们特定的事件。 如果仆人线程需要其他地方的信息(如“回拨”),国王线程将停止处理该仆人线程,并移动到事件队列中的下一个仆人线程。 喋血之王可以继续工作或收集信息,而国王线正在处理王国的所有事件。

这样一来,国王线就只需要一次处理一个事件,而且很快,因为他是一个有效率的国王线。 如果有一个仆人的话题,他的所有其他仆人线程都必须轮到他们。 但是,任何一个仆人都可以继续为King线程收集信息(比如拉入一个HTTP请求或者推出一个DB查询),直到它拥有King Thread的信息,然后跳进排队等待King Thread处理其事件。

希望有助于:)