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

Posted

技术标签:

【中文标题】node.js 进程如何知道何时停止?【英文标题】:How does a node.js process know when to stop? 【发布时间】:2011-12-03 16:07:41 【问题描述】:

由于许多 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);
  );
); 

【问题讨论】:

【参考方案1】:

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

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

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

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

请注意,“排队工作”可能包括诸如等待计时器或等待网络数据到达之类的事情。你提出一个请求,上面写着“当/如果以后有事情发生时给我打电话”。

setTimeout() 也是一个工作请求(如果你眯着眼睛看的话)。有了计时器,您就知道某事会发生以及何时发生。使用 setTimeout() 只会发生一个“事情”。节点只会对您的回调进行一次调用,然后“忘记”工作请求。相反,如果您使用 setInterval(),则您创建了一个持久的工作请求。节点会将工作请求“保留”在其表中,并重复调用您的回调,直到您取消请求。

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

【讨论】:

工作请求和表格的概念是您为了说明您的观点而编造的,还是这些实际构造用于节点的实现?我问是因为我没有看到这些术语在其他任何地方使用。 我相信工作请求被称为任务,表被称为任务队列。见jakearchibald.com/2015/tasks-microtasks-queues-and-schedules

以上是关于node.js 进程如何知道何时停止?的主要内容,如果未能解决你的问题,请参考以下文章

如何决定何时使用 Node.js?

将文件添加到目录时,在node.js中获取通知

Node.js log4j-like 日志系统

我无法弄清楚如何防止在 Node.js 中出现此 CORS 错误 [重复]

Node.js 检测两个猫鼬查找何时完成

仪器处理何时停止