Node JS、createServer和事件循环
Node JS, createServer, and the Event Loop
在节点的幕后,http
模块的createServer
方法(及其回调)如何与事件循环交互?是否可以在userland中自己构建类似于createServer
的功能,或者这需要更改节点的底层系统代码?
也就是说,我对节点的事件循环的一般理解是
- 事件循环记号
- 节点查找要运行的任何回调
- 节点运行这些回调
- 事件循环再次滴答作响,过程无限重复
我仍然有点模糊的是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请求?或者有什么更低级、更高效的东西在发生。我知道我不需要完全理解这一点就可以编写高效的节点代码,但我很好奇底层系统是如何实现的。
(我试着在节点源代码中跟随,但进展很慢,因为我不熟悉节点模块系统,也不熟悉系统代码中编码模式的遗留假设)
http.createServer
是一种方便的方法,用于创建新的http.Server()
并将回调作为事件侦听器附加到request
事件。当然,节点http库也实现了协议解析。
事件循环没有持续的轮询,节点正在等待C++tcp绑定在套接字上接收数据,然后套接字将该数据作为buffer
编组到回调。
如果您要实现自己的http解析器,您将从net.Server
对象作为基础开始。请在此处查看节点的实现:https://github.com/joyent/node/blob/master/lib/_http_server.js#L253
事件库执行CrazyTrain在评论中提到的事件的生成和处理。它有EventEmitter类,用于服务器、套接字和流等。
事件循环,就像您所说的一个无限循环,在每次勾选后执行回调。http服务器提供的回调是一个事件处理程序,专门用于事件请求。
var server = http.createServer(function (request, response) //request handler
事件处理程序可以执行多次http.server是EventEmitter的一个实例。它处理传入请求的方式是首先解析传入请求。解析后,它会发出请求事件。事件发射器然后使用提供的参数执行请求的回调。
EventEmitter不是事件循环的一部分,这是对的。它需要由模块或库的开发人员实现,只需使用模块用户提供的处理程序。但最重要的是,它提供了实现事件的必要机制。
- 事件循环、回调队列和 Javascript 的单线程是如何连接的
- JavaScript运行时事件循环现有技术
- 事件循环的MEAN.JS setInterval进程(从另一个服务器获取数据)
- 页面卸载期间的JavaScript事件循环
- Node.js阻止事件循环
- 了解执行模型和事件循环
- 什么是“;Promise在事件循环的同一个循环上点火“;意思是
- JS调试器是否挂起整个JS事件循环
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 在 Web 浏览器中收集有关事件循环的信息
- 检测事件循环“滞后”
- “旋转事件循环”是什么意思
- 如何在 nodejs 中维护事件循环中的持久数据
- DOMNode插入的事件循环
- Javascript事件循环任务队列溢出是否可能
- JavaScript 中的事件处理程序如何由事件循环处理
- Node.js 不是文件上传(以及所有基于事件循环的语言)的好选择 - 这是真的
- 为什么 while 循环会阻塞事件循环
- node.js事件循环何时终止
- C#“;事件循环”;与JavaScript“相比较;事件循环”;