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

2024-01-02

由于许多 Node.js 脚本遵循异步执行某些操作的模式(下面的示例),它们如何知道何时停止?

在下面的代码中,节点在处理 writeFile 并适当注册回调后如何确定该进程应保持活动状态直到回调运行?

fs = require('fs');

fs.writeFile('foo', 'cat', function() {
  console.log('wrote to foo!'); 
  fs.readFile('foo', 'utf8', function(err, data) {
    console.log(data);
  });
}); 

节点跟踪所有未完成的工作请求。您的 fs.writefile() 调用创建 I/O 工作请求并将您的回调添加到该请求中。节点在启动 I/O 活动的同时将工作请求保存到其表中。当您到达函数末尾时,您的代码执行将退出。 (但你的记忆/变量/等仍然存在)

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

如果您什么都不做,不再发出任何请求,那么当您从函数返回时,节点将停止,因为这样队列中就不会再有任何剩余的请求。

因此,节点“知道”继续运行,因为它跟踪其表中的活动工作请求,并且在所有排队工作完成并且这些表为空之前不会停止。

请注意,“排队工作”可以包括等待计时器或等待网络数据到达之类的事情。您提出一个请求,内容是“如果稍后有事情发生,请给我打电话”。

setTimeout() 也是一个工作请求(如果你稍微眯一下)。有了计时器,您就知道会发生什么事情以及什么时候会发生。使用 setTimeout() 只会发生一件“事情”。节点只会对您的回调进行一次调用,然后“忘记”工作请求。如果您使用 setInterval(),您就创建了一个持久工作请求。节点会将工作请求“保留”在其表中,并重复调用您的回调,直到您取消该请求。

net.Server.listen() 是另一个工作请求,它是持久工作请求。您不知道回调何时被调用或调用多少次,因为这取决于连接到服务器的远程客户端。节点将工作请求保留在其表中,直到您取消该请求为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 进程如何知道何时停止? 的相关文章

随机推荐