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

时间:2011-10-08 18:22:42

标签: node.js

由于许多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 个答案:

答案 0 :(得分:45)

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

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

如果您不再执行任何操作,请不要再发出任何请求,那么当您从函数节点返回时,该节点将停止,因为这样队列中将不会有任何剩余请求。

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

请注意,“排队工作”可能包括等待计时器或等待网络数据到达等内容。你提出的请求是“如果以后发生某事,请在这里给我打电话”。

setTimeout()也是一个工作请求(如果你斜视一下)。有了计时器,你就会知道会发生什么事情,什么时候会发生。使用setTimeout()只会发生一个'某事'。 node只会调用一次回调,然后“忘记”工作请求。相反,如果使用setInterval(),则创建了持久性工作请求。节点将“保留”其表中的工作请求,并将重复调用您的回调,直到您取消请求。

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