为什么process.stdin上的监听器会阻止节点终止?

时间:2017-08-28 07:31:59

标签: node.js

我是一名试图了解节点的Java程序员。对我来说没有意义的是下面的代码如何阻止进程终止?

process.stdin.on('data', function(data) {
 console.log('Foobar');
        }
);

这引起了很多问题 - :

  1. 如果侦听器附加到任何东西或只是全局进程对象,NodeJ会继续运行吗?
  2. 如果连接了侦听器,为什么NodeJ不会终止?
  3. 这只是数据事件的行为吗?或者其他事件也导致相同的行为?
  4. 可以阻止节点进程终止的其他方式是什么?

3 个答案:

答案 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。节点进程可以阻止终止的其他方式是什么?

无论什么时候可以调用事件监听器。