Node JS,createServer和Event Loop

Ala*_*orm 8 javascript node.js

在节点的幕后,http模块的createServer方法(及其回调)如何与事件循环交互?是否有可能createServer在userland中构建类似于我自己的功能,或者这需要更改节点的底层系统代码?

也就是说,我对节点事件循环的一般理解是

  1. 事件循环滴答声
  2. Node查找要运行的任何回调
  3. Node运行那些回调
  4. 事件循环再次打勾,进程重复ad-infinitum

我仍然有点模糊的是如何createServer适应事件循环.如果我做这样的事情

var http = require('http');

// create an http server  and handle with a simple hello world message
var server = http.createServer(function (request, response) {
    //...
});
Run Code Online (Sandbox Code Playgroud)

每当HTTP请求进来时,我告诉节点运行我的回调.这似乎与我理解的事件循环模型不兼容.似乎有一些非userland和非事件循环正在侦听HTTP请求,然后运行我的回调,如果有人进来.

换句话说 - 如果我考虑实现我自己的版本版本createServer,我想不出办法,因为我安排的任何回调都会运行一次.是否createServer仅使用setTimeoutsetInterval不断重新检查传入的HTTP请求?或者有更低层次,更高效的事情.我理解我不需要完全理解这一点来编写有效的节点代码,但我很好奇底层系统是如何实现的.

(我尝试在节点源中进行跟踪,但由于我不熟悉节点模块系统,或者对系统代码深处的编码模式的遗留假设w/r/t),因此进展缓慢

Ben*_*ber 3

http.createServer是一种创建新回调http.Server()并将回调作为事件侦听器附加到request事件的便捷方法。当然node http库也实现了协议解析。

事件循环没有持续轮询,节点正在等待 C++ tcp 绑定以接收套接字上的数据,然后将该数据编组为buffer回调。

如果您要实现自己的 http 解析器,您将从一个net.Server对象作为基础开始。在这里查看节点的实现:https://github.com/joyent/node/blob/master/lib/_http_server.js#L253

  • 谢谢 Ben,有了这些信息,我认为我的实际问题是“节点在哪里/如何等待 C++ tcp 绑定在套接字上接收数据?” 这就是 https://github.com/joyent/node/blob/master/lib/net.js#l294 对(看似全局且未定义的)“listen”函数的调用吗?或者这太长而无法在评论中解释? (3认同)