Node JS,createServer和Event Loop
在节点的幕后, http
模块的createServer
方法(及其callback)如何与事件循环交互? 是否可以在userland中自己构build类似于createServer
function,还是需要更改节点的底层系统代码?
也就是说,我对node的事件循环的一般理解是
- 事件循环蜱
- 节点查找任何callback运行
- 节点运行这些callback
- 事件循环再次嘀嗒,过程重复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) { //... });
我告诉节点运行我的callback,每当一个HTTP请求进来。这似乎不兼容我明白的事件循环模型。 好像有一些非用户区和非事件循环正在监听HTTP请求,然后运行我的callback(如果有)。
换个angular度来说 – 如果我考虑实现我自己的版本的createServer
,我想不出办法做到这一点,因为我计划的任何callback将运行一次。 createServer
只是使用setTimeout
或setInterval
来不断重新检查传入的HTTP请求? 还是有更低的水平,更高效的进行。 我知道我不需要完全理解这个写高效的节点代码,但我很好奇底层系统是如何实现的。
(我在节点源代码中尝试过,但是由于我不熟悉节点模块系统,或者对系统代码中的深层编码模式有遗漏的假设)
http.createServer
是创build一个新的http.Server()
并将该callback作为事件监听器附加到request
事件的一种便捷方法。 当然,http库也实现协议parsing。
没有对事件循环进行持续轮询,节点正在等待C ++ tcp绑定接收套接字上的数据,然后将这些数据作为buffer
到您的callback中。
如果你要实现你自己的HTTPparsing器,你将以net.Server
对象为基础。 请参阅节点的实现: https : //github.com/joyent/node/blob/master/lib/_http_server.js#L253
事件库在CrazyTrain的评论中提到了事件的产生和处理。 它具有用于服务器,套接字和stream等的EventEmitter类。
事件循环像你说的那样,在每次打勾后执行callback的无限循环。 http服务器提供的callback函数是一个事件处理器,专门用于事件请求 。
var server = http.createServer(function (request, response) //request handler
事件处理程序可以执行多次。 http.server是EventEmitter的一个实例。 它处理传入请求的方式是它首先parsing传入的请求。 parsing后,它发出 请求事件。 eventemitter然后使用提供的参数执行请求的callback。
你是对的,EventEmitter不是事件循环的一部分。 需要由模块或库的开发人员来实现,只使用模块用户提供的处理程序。 但最重要的是,它提供了实施活动的必要机制。