server.listen方法如何使节点进程仍然运行

时间:2018-10-12 03:08:58

标签: node.js server process nodes listen

我对server.listen方法如何使节点进程保持运行有疑问。里面有setInterval方法吗?

我已阅读帖子How does `server.listen()` keep the node program running中的答案。但是还是不明白。

任何人都知道,请向我解释。谢谢。

2 个答案:

答案 0 :(得分:1)

libuv内部的

Node.js具有某种数量的计数器,这些计数器应该使进程保持运行状态。不仅仅是计时器在这里起作用。任何类型的打开TCP套接字或侦听服务器也都需要计数,其他异步操作(例如进程内文件I / O操作)也是如此。您可以在node.js源代码中看到对uv_ref()uv_unref()的调用。这就是node.js内部代码标记资源的方式,该资源应保持进程运行或完成后释放它们。

每当事件循环为空时,意味着没有任何待处理的事件要运行,node.js会在libuv中检查此计数器,如果它为零,则退出该进程。如果它不为零,则仍然存在一些可以保持进程运行的东西。

因此,假设您有一个运行在侦听服务器上的空闲服务器和一个空事件循环。 libuv计数器将为非零值,因此node.js不会退出该进程。现在,某些客户端尝试连接到您的服务器。在最低级别上,操作系统的TCP接口会通知node.js中的某些本机代码有一个客户端刚刚连接到您的服务器。然后,此本地代码将其打包到一个node.js事件中,并将其添加到node.js事件队列中。这会导致libuv唤醒并处理该事件。它将其从事件队列中拉出,并调用与该事件关联的JS回调,从而导致node.js中的某些JS代码运行。最终将在该服务器(eventEmitter类型)上发出一个事件,该事件将由服务器接收的JS代码监视,然后JS代码可以开始处理该传入请求。

因此,在最低级别上,node.js的TCP支持中内置了本机代码,该代码使用OS级TCP接口来通知OS您刚刚收到了服务器的传入连接。它将转换为node.js事件队列中的一个事件,该事件使解释器运行与该事件关联的Javascript回调。

该回调完成后,node.js将再次检查计数器以查看该进程是否应该退出。假设服务器仍在运行并且没有调用.unref()并将其从计数器中删除,那么node.js将看到仍有东西在运行,并且该进程不应退出。

答案 1 :(得分:0)

它正在事件循环中运行。

每次事件循环都在寻找任何挂起的操作时,server.listen()操作就会出现。