在 node 的幕后,http
模块的createServer
方法(及其回调)如何与事件循环交互?是否可以在用户空间中构建类似于createServer
我自己的功能,或者这是否需要更改节点的底层系统代码?
也就是我对node的事件循环的大致理解是
- 事件循环滴答声
- Node 查找要运行的任何回调
- 节点运行这些回调
- 事件循环再次滴答作响,过程无限重复
我仍然有点模糊的是如何createServer
适应事件循环。如果我做这样的事情
var http = require('http');
// create an http server and handle with a simple hello world message
var server = http.createServer(function (request, response) {
//...
});
我告诉节点在 HTTP 请求进入时运行我的回调。这似乎与我理解的事件循环模型不兼容。似乎有一些非用户态和非事件循环正在侦听 HTTP 请求,然后在有请求时运行我的回调。
换句话说——如果我考虑实现我自己的版本版本createServer
,我想不出办法来做到这一点,因为我安排的任何回调都会运行一次。createServer
只是使用setTimeout
还是setInterval
不断地重新检查传入的 HTTP 请求?或者是否有一些更低级别、更有效的事情发生。我知道我不需要完全理解这一点来编写高效的节点代码,但我很好奇底层系统是如何实现的。
(我尝试在节点源代码中跟随,但进展缓慢,因为我不熟悉节点模块系统,或者系统代码深处的编码模式的遗留假设)