什么时候Nodejs进程退出?
一个简单的节点程序在运行完所有的代码后立即退出:
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世界里的机制是什么?
[…]是什么造成这种差异? 是什么让第一个程序在执行所有代码后退出,而第二个程序继续存在?
第二节目.listen()
编辑。
节点的机制是事件循环 , node
进程通常会在下列情况下退出:
- 事件循环的队列是空的。
- 没有后台/asynchronous任务仍然能够添加到队列中。
.listen()
build立一个永久性的任务,无限期地添加到队列中。 也就是说,直到.close()
d或进程终止。
延长第一个应用程序的简单例子是添加一个计时器 :
setTimeout(function () { console.log('hello'); }, 10000);
对于该应用程序的大部分运行时,事件队列将为空。 但是,计时器将以后台/asynchronous方式运行,等待10秒后再将callback添加到队列中,以便可以logging'hello'
。 之后,随着计时器完成,两个条件都得到满足,并且过程退出。
更多的评论不是一个答案,但它与监听服务器进程无关。 正如Jonathan Lonowski所说,它基于事件循环。 例如,这是吉姆·威尔逊的Node.js正确的方法 :
// 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。
Node.js跟踪活动事件监听器 。 只要没有活动事件监听器,Node.js程序就会终止。
Hello world程序不会启动任何事件侦听器,因此在源代码执行后终止。
HTTP服务器程序的行为有所不同。 它创build一个服务器并将其绑定到一个端口。 通过这样做,只要build立了新的HTTP连接,就会注册一个处理程序。 当到达程序代码的末尾时,有一个活动的事件监听器出现,程序继续运行。
你可以通过在一段时间后发出server.close()
来终止服务器程序。