当Node的事件循环完全耗尽时,该进程存在。但是,由于server.listen()
,这种情况在HTTP服务器上不会发生。但是该功能到底有什么作用?
看着the code和an old incomplete answer,它最终调用self._listen2()
,它在process.nextTick
上发出“监听”事件,并从{{1}获取异步钩子ID。 }。
但是,我还是不明白。我在这里想念什么?仅此代码如何使事件循环保持“空闲”状态?函数如何包装在C侧?实际执行此操作的代码行在哪里?
谢谢!
答案 0 :(得分:3)
真正的答案finally came from Bert Belder,曾为libuv工作。
Node每次将要在将来某个时刻解决的操作排入队列,以为异步功能或计时器都在考虑,它有一个ref(参考)标记,以提醒自己正在等待将来的工作。事件循环检查是否有任何引用。如果ref计数器为0,则Node退出该过程。如果有引用,则事件循环返回到开始并执行其操作。您可以将其视为超简单的while(refCounter)
循环。
那么,服务器会发生什么?除了侦听功能不会减少ref计数器,这一过程完全相同。事件循环会看到至少剩下一个引用,因此它永远不会结束,而是返回到开始并循环直到发生新的事情。
您可以通过在带有net或http模块的服务器对象上使用server.unref()
来查看此内容。在其他对象上也可以使用unref方法,该方法告诉Node在事件循环结束时计数时,忽略该特定功能的ref。如果您运行下面的代码,则即使Node开始监听端口,它也会关闭进程。
const http = require("http");
http
.createServer((req, res) => {
res.writeHead(200);
res.end("Bye bye");
})
.listen(3333)
.unref();
答案 1 :(得分:0)
让我在这里解释几个步骤: 1.在特定端口上启动服务器,它的作用是“它启动一个进程,该进程是服务器进程,该进程运行类似
while(true){
readdatafromport();
if(unhandledexceptionHappened){
killtheServerProcess();
}
}
它将继续读取,除非发生异常。如果发生异常,它将终止服务器进程,并且您的HTTP服务器将关闭或崩溃。
执行以下代码时:
server.listen()
如果有新数据传入,它只是注册侦听端口。在TCP / IP中,当客户端调用服务器时,他们基本上将请求写在服务器PORT上(为便于说明,我将其说出来)。由于服务器处理正在侦听端口中的更改,因此它可以对此做出响应。如果您了解节点事件的工作原理,那么希望您了解服务器进程如何可以同时管理许多请求。