Node JS,createServer和Event Loop

时间:2013-08-18 22:49:44

标签: javascript node.js

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

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

  1. 事件循环滴答
  2. Node查找要运行的任何回调
  3. Node运行那些回调
  4. 事件循环再次打勾,流程重复ad-infinitum
  5. 我仍然有点模糊,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请求进来时运行我的回调。这似乎与我理解的事件循环模型不兼容。看起来有一些非userland和非事件循环正在侦听HTTP请求,然后在进入时运行我的回调。

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

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

2 个答案:

答案 0 :(得分:3)

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 :(得分:1)

events库在评论中完成了CrazyTrain所提到的事件的生成和处理。它有 EventEmitter 类,用于服务器,套接字和流等。

事件循环就像你说的每个tick之后执行回调的无限循环。 http服务器提供的回调是一个事件处理程序,特别是对于事件 request

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

可以多次执行事件处理程序。 http.server EventEmitter 的一个实例。它处理传入请求的方式是首先解析传入的请求。解析后,emits request事件{{3}}。然后,eventemitter使用提供的参数执行请求的回调。

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