我是一名试图了解节点的Java程序员。对我来说没有意义的是下面的代码如何阻止进程终止?
process.stdin.on('data', function(data) {
console.log('Foobar');
}
);
这引起了很多问题 - :
答案 0 :(得分:2)
<强> 1。如果有监听器附加到任何东西或只是全局流程对象,NodeJ会继续运行吗?
这与process.stdin
创建socket
更准确net.Socket()
更为相关,这是一个双工流,既可读又可写,而且这是一个{{1}所以当你将一个监听器附加到EventEmitter
时,你打开了套接字,你正在等待在套接字中写一些东西。
所以这里的问题不是process.stdin
处理程序,而是等待EventEmitter's
事件终止进程的流。
<强> 2。如果附加了侦听器,为什么NodeJ不会终止?
因为你打开了套接字连接,只有一个特殊的结束事件
终止它。在您的情况下,当您提供将触发特殊end
事件end
的终止命令时,它将终止;
第3。这只是数据事件的行为吗?或者其他事件是否也会导致相同的行为?
对于CTRL+C
所有事件和其他连接类型i / o。数据库连接,http请求等...
<强> 4。节点进程可以阻止终止的其他方式是什么?
使用process.stdin
process.stdin.constructor
的源代码
process.stdin.constructor.toString()
答案 1 :(得分:1)
节点完成其工作后退出。如果设置事件监听器,它将不会终止,因为它仍然有一个要运行的作业 - 你的代码告诉它必须要监听某种事件。因此,只要它是任何事件监听器,它绑定到任何仍然存在的对象并且可以被调用,它将继续运行。如果退出事件,节点将为您清理所有内容。
答案 2 :(得分:1)
Update:
According to the Event Loop文档:
Node.js检查它是否在等待任何异步I / O或定时器,如果没有,则检查是否干净。
根据Node.js Process文件:
通常,Node.js进程将在没有安排工作时退出
因此,Node.js是否将被终止取决于是否还有预定工作。
对于您的process.stdin.on('data'...
示例,当代码执行完毕时,仍然会安排工作 - 应捕获并处理用户输入。因此,Node.js进程不会被终止。
另一个例子是HTTP请求。如果Node.js发送HTTP请求(返回将需要30秒),则在检索和处理响应之前不会终止Node.js进程 - 除非所有计划的工作都完成,Node.js进程将继续运行。
当然,预定的工作是否“完成”是由Node.js定义的 - 在HTTP请求的情况下,如果你只是发送请求而不关心响应(没有响应处理程序),那么就会有将此计划工作定义为“已完成”的两种方法:A。发送HTTP请求,这就是全部。 B.无论是否有任何响应处理程序,都会发送HTTP请求并重新执行响应。 Node.js选择策略B。
第三个例子是自定义事件及其事件监听器。请考虑以下代码:
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
当完成此代码执行时,虽然仍然存在事件侦听器,但Node.js进程将被终止,因为Node.js检测到不再存在调度的工作 - 没有代码正在运行且没有其他处理程序等待,因此永远不会再触发自定义事件。
因此,对于你的4个问题:
1。如果有监听器连接到任何东西或只是全局流程对象,NodeJ会继续运行吗?
不仅仅是全局流程对象。对于监听器,它取决于是否还有任何预定的工作(是否可能触发监听器)。
2。如果连接了侦听器,为什么NodeJ不会终止?
JavaScript使用单线程模型,并使用事件循环来处理各种动作逻辑。如果Node.js在执行主代码后终止,那么它只能用于编写非常小的程序。它将无法收听用户操作/外部请求等。
3。这只是数据事件的行为吗?或者其他事件也会导致相同的行为?
其他事件也可能导致相同的行为,取决于该事件是否会触发预定工作。
4。节点进程可以阻止终止的其他方式是什么?
无论什么时候可以调用事件监听器。