一个 Node.js 进程如何知道何时停止?

21 浏览
0 Comments

一个 Node.js 进程如何知道何时停止?

由于许多node.js脚本都遵循异步执行的模式(如下例),它们如何知道何时停止?\n在下面的代码中,node.js是如何在处理writeFile并适当注册回调后,确定进程应保持活动状态直到回调函数被执行?

0
0 Comments

Node.js的进程如何知道何时停止?

Node.js通过跟踪所有未完成的工作请求来知道何时停止。当您调用fs.writeFile()时,会为I/O创建一个工作请求,并将回调函数添加到该请求中。同时,Node.js将工作请求保存到其表中,并开始I/O活动。当您的代码执行到函数末尾时,代码执行退出(但内存、变量等仍然存在)。

稍后,I/O完成,Node.js从其表中取出工作请求。它看到请求中附加了回调函数,因此使用I/O请求的结果调用该函数。由于全局数据仍然存在,并且闭包中的变量仍然存在,因此您的代码似乎从未停止。

如果您不做任何其他操作,不进行任何其他请求,那么当您从函数返回时,Node.js将停止,因为此时队列中将没有任何剩余的请求。

因此,Node.js通过跟踪其表中的活动工作请求,并在所有排队工作完成且表为空时才停止。

请注意,“排队工作”可以包括等待计时器或等待网络数据到达等情况。您发出的请求是“在稍后发生某事时/如果某事发生时,请在此处调用我”。

setTimeout()也是一个工作请求(稍稍区分一下)。使用计时器,您知道某事将会发生,以及何时发生。而使用setTimeout(),只会发生一次“某事”。Node.js只会调用一次您的回调函数,然后“忘记”这个工作请求。如果您改用setInterval(),则创建了一个持久的工作请求。Node.js将在其表中“保留”这个工作请求,并会重复调用您的回调函数,直到取消请求为止。

net.Server.listen()是另一个持久性工作请求。您无法预知何时以及多少次调用您的回调函数,因为这取决于远程客户端连接到您的服务器。Node.js将在其表中保持这个工作请求,直到您取消请求为止。

“工作请求”和“表”这些概念是您为了说明而编造的,还是在Node.js的实现中真正使用的构造?我之所以问这个问题,是因为我在其他地方没有看到这些术语的使用。

我认为工作请求被称为任务,表被称为任务队列。请参考jakearchibald.com/2015/tasks-microtasks-queues-and-schedules

0