Nodejs什么时候退出?

时间:2013-10-31 06:17:18

标签: node.js

在运行所有代码后立即退出一行简单的节点程序:

console.log('hello');

但是,在执行所有代码后,侦听端口的http服务器程序不会退出:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

所以我的问题是,是什么造成了这种差异?是什么让第一个程序在执行所有代码后退出,而第二个程序继续存在?

我在Java中理解,规范说当最后一个非守护程序线程退出时,JVM退出。那么,nodejs世界的机制是什么?

3 个答案:

答案 0 :(得分:10)

  

[...]是什么造成了这种差异?是什么让第一个程序在执行所有代码后退出,而第二个程序继续存在?

第二个节目.listen()编辑。

节点的机制是event loopnode进程通常会在以下情况下退出:

  • 事件循环的队列为空。
  • 没有能够添加到队列的后台/异步任务。

.listen()建立一个无限期能够添加到队列的持久性任务。也就是说,直到它为.close()d或过程终止。

延长第一个应用程序的一个简单示例是add a timer到它:

setTimeout(function () {
    console.log('hello');
}, 10000);

对于该应用程序的大部分运行时,事件队列将为空。但是,计时器将在后台/异步运行,在将回调添加到队列之前等待10秒,以便可以记录'hello'。之后,完成计时器后,两个条件都会得到满足,并且进程退出。

答案 1 :(得分:0)

更多的评论而不是答案,但它与监听服务器进程无关。正如Jonathan Lonowski所说,它基于一个事件循环。例如,这来自Jim Wilson的Node.js the Right Way

// watcher.js - watches a text file for changes.
const fs = require('fs');

fs.watch('target.txt', function() {
    console.log("Target.txt just changed!");
});

console.log("Watching target.txt");

使用node --harmony watcher.js调用它。

它没有退出;它需要 CTRL + C

答案 2 :(得分:0)

Node.js跟踪active event listeners。只要没有活动事件侦听器,Node.js程序就会终止。

Hello world -program不会启动任何事件侦听器,因此在源代码执行后终止。

HTTP服务器程序的行为有所不同。它创建一个服务器并将其绑定到一个端口。通过这样做,它会在建立新的HTTP连接时注册要调用的处理程序。当到达程序代码的末尾时,存在一个活动的事件监听器,程序继续运行。

您可以在一段时间后发出server.close()来终止服务器程序。