2013-08-18 37 views
4

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

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

  1. 事件循环蜱
  2. 节点查找任何回调运行
  3. 节点运行的回调
  4. 事件循环蜱再次,过程重复无穷无尽

我还有点模糊的是如何适应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只是使用setTimeoutsetInterval来不断重新检查传入的HTTP请求?或者是有更低的水平,更有效的继续。我知道我不需要完全理解这一点来编写高效的节点代码,但我很好奇底层系统是如何实现的。

(我试过在node source下沿,但因为我不熟悉的节点模块系统,或传统的假设W/R/T编码模式深藏在系统代码中会很慢)

+0

节点具有较低级别的网络支持http://nodejs.org/api/net.html,所以如果这就是你的意思,你应该可以创建自己的HTTP实现。 Node的事件系统可以通过实现一个* EventEmitter *来构建到你的类中。 http://nodejs.org/api/events.html –

+0

...最终如果你的问题是如何实现底层系统,那么我不知道任何比阅读源代码更好的方法。 –

+0

@CrazyTrain非常真实,但要真正学习代码案例可能需要数周,而不是几个月。有时候有人指着你正确的方向可以为你节省大量的时间。 –

回答

2

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

没有对事件循环进行持续轮询,节点正在等待C++ tcp绑定在套接字上接收数据,然后将该数据作为buffer收集到您的回调中。

如果您要实现自己的http解析器,您将以net.Server对象为基础开始。请参阅节点的实现:https://github.com/joyent/node/blob/master/lib/_http_server.js#L253

+1

感谢Ben,有了这些信息,我认为我的实际问题是“节点在哪里/如何等待C++ tcp绑定在套接字上接收数据?”这是什么(看似全局和未定义)的'listen'函数是用于https://github.com/joyent/node/blob/master/lib/net.js#l294?或者这是否太长以解释评论? –

+0

它在libuv库中等待。如果你使用的是linux,代码是somwhere here:https://github.com/joyent/libuv/blob/master/src/unix/linux-core.c#L75 –

+0

这可能是理解epoll系统调用的好开始:http://en.wikipedia.org/wiki/Epoll –

1

events库不会生成和处理CrazyTrain在注释中提到的事件。它有EventEmitter类用于服务器,套接字和流等

事件循环就像你说的一个无限循环在每次打勾后执行回调。 http服务器提供的回调函数是一个事件处理程序,具体用于事件请求

var server = http.createServer(function (request, response) //request handler 

事件处理程序可以执行多次。 http.serverEventEmitter的实例。它处理传入请求的方式是它首先解析传入的请求。解析时,它emitsrequest事件。 eventemitter然后使用提供的参数执行请求的回调。

你说得对,EventEmitter不是事件循环的一部分。它需要由模块或库的开发人员实施,仅使用模块用户提供的处理程序。但最重要的是,它提供了实施活动的必要机制。