在Node的幕后,http
模块的createServer
方法(及其回调)如何与事件循环交互?我是否可以在用户空间中构建类似于createServer
的功能,还是需要更改Node的底层系统代码?
也就是说,我对Node事件循环的一般理解是:
- 事件循环开始
- 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) {
//...
});
我告诉Node当有HTTP请求时运行我的回调函数。这似乎与我了解的事件循环模型不兼容。似乎有一些非用户空间和非事件循环正在侦听HTTP请求,然后在收到请求时运行我的回调函数。
换句话说——如果我考虑实现自己的createServer
版本,我无法想到一种方法来做到这一点,因为我安排的任何回调都只会运行一次。 createServer
是否仅使用setTimeout
或setInterval
来不断重新检查传入的HTTP请求?还是有更底层、更高效的东西正在进行?我知道我不需要完全理解这个过程才能编写高效的Node代码,但我很好奇底层系统是如何实现的。
(我尝试跟着Node源码走,但由于不熟悉Node模块系统或系统代码中深层次的编码模式的传统假设,速度很慢)