Node如何使服务器进程保持活动状态?

时间:2018-07-18 14:27:19

标签: node.js server process

当Node的事件循环完全耗尽时,该进程存在。但是,由于server.listen(),这种情况在HTTP服务器上不会发生。但是该功能到底有什么作用?

看着the codean old incomplete answer,它最终调用self._listen2(),它在process.nextTick上发出“监听”事件,并从{{1}获取异步钩子ID。 }。

但是,我还是不明白。我在这里想念什么?仅此代码如何使事件循环保持“空闲”状态?函数如何包装在C侧?实际执行此操作的代码行在哪里?

谢谢!

2 个答案:

答案 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服务器将关闭或崩溃。

  1. 执行以下代码时:

     server.listen()
    

    如果有新数据传入,它只是注册侦听端口。在TCP / IP中,当客户端调用服务器时,他们基本上将请求写在服务器PORT上(为便于说明,我将其说出来)。由于服务器处理正在侦听端口中的更改,因此它可以对此做出响应。如果您了解节点事件的工作原理,那么希望您了解服务器进程如何可以同时管理许多请求。