12

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

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 世界中的机制是什么?

4

3 回答 3

14

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

第 2 期节目.listen()编。

Node 的机制是事件循环node进程通常会在以下情况下退出:

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

.listen()建立一个可以无限期添加到队列中的持久任务。也就是说,直到它是.close()d或进程终止。

延长第一个应用程序的一个简单示例是为其添加一个计时器

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

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

于 2013-10-31T06:43:11.133 回答
0

Node.js 跟踪活动的事件侦听器。一旦没有活动的事件侦听器离开,Node.js 程序就会终止。

Hello world 程序不启动任何事件监听器,因此在源代码执行后终止。

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

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

于 2015-12-01T13:27:53.450 回答
-1

更多的是评论而不是答案,但它与侦听服务器进程无关。正如 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

于 2014-08-25T04:05:51.033 回答