在运行所有代码后立即退出一行简单的节点程序:
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世界的机制是什么?
答案 0 :(得分:10)
[...]是什么造成了这种差异?是什么让第一个程序在执行所有代码后退出,而第二个程序继续存在?
第二个节目.listen()
编辑。
节点的机制是event loop,node
进程通常会在以下情况下退出:
.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()
来终止服务器程序。