作者:cmm雨轩 | 来源:互联网 | 2022-12-10 12:20
当Node的事件循环完全耗尽时,该过程存在。但是,由于,例如,这不会在HTTP服务器上发生server.listen()
。但是该功能到底有什么作用?
看着代码和一个旧的不完整的答案,它最终会调用self._listen2()
,在上发出“监听”事件process.nextTick
,并从中获取异步钩子ID DefaultTriggerAsyncId()
。
但是,我还是不明白。我在这里想念什么?仅此代码如何使事件循环保持“空闲”状态?函数如何包装在C侧?实际执行此操作的代码行在哪里?
谢谢!
1> Alex D..:
真正的答案最终来自于libuv的Bert Belder。
每次Node将要在将来某个时间解决的动作排队时,考虑异步功能或计时器,它都会有一个ref-标记,以提醒自己它正在等待将来的某些工作。事件循环检查是否有任何引用。如果ref计数器为0,则Node退出该过程。如果有引用,则事件循环返回到开始并执行其操作。您可以将其视为一个超级简单的while(refCounter)
循环。
那么,服务器会发生什么?除了listen函数不会减少ref计数器之外,这个确切的过程。事件循环看到总是至少剩下一个引用,因此它永远不会结束,而是返回到开始并循环直到发生新的事情。
您可以通过server.unref()
在服务器对象上使用net或http模块来查看此信息。在其他对象上也可以使用unref方法,该方法告诉Node在事件循环结束时计数时,忽略该特定功能的ref。如果运行下面的代码,则即使Node开始监听端口,它也会关闭进程。
const http = require("http");
http
.createServer((req, res) => {
res.writeHead(200);
res.end("Bye bye");
})
.listen(3333)
.unref();