gpt4 book ai didi

javascript - Node JS、createServer 和事件循环

转载 作者:数据小太阳 更新时间:2023-10-29 04:17:12 25 4
gpt4 key购买 nike

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

也就是我对node的event loop的大致理解是

  1. 事件循环滴答
  2. Node 寻找任何要运行的回调
  3. Node 运行这些回调
  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) {
//...
});

我告诉 Node 在收到 HTTP 请求时运行我的回调。这似乎与我理解的事件循环模型不兼容。似乎有一些非用户区和非事件循环正在监听 HTTP 请求,然后在请求到来时运行我的回调。

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

(我尝试在 node source 中跟进,但进展缓慢,因为我不熟悉 Node 模块系统,也不熟悉系统代码深处编码模式的遗留假设)

最佳答案

http.createServer 是一种方便的方法,用于创建新的 http.Server() 并将回调作为事件监听器附加到 request 事件。当然,node http 库也实现了协议(protocol)解析。

事件循环没有持续轮询, Node 正在等待 C++ tcp 绑定(bind)在套接字上接收数据,然后将该数据编码为 缓冲区 到您的回调。

如果您要实现自己的 http 解析器,您将从 net.Server 对象作为基础开始。在此处查看 Node 的实现:https://github.com/joyent/node/blob/master/lib/_http_server.js#L253

关于javascript - Node JS、createServer 和事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com