所有侦听器都删除后,为什么我的Node.js进程不终止?

肖恩

在以下代码中,我使用方法data事件分配了一个侦听器process.stdinonce

console.log('Press Enter to allow process to terminate')
process.stdin.once('data', callback)

function callback (data) {
    console.log('Process can terminate now')
}

从理论上讲,触发回调后,应自动删除事件侦听器(因为我将其附加了once),从而允许进程终止。令人惊讶的是,在这种情况下,该过程永远不会终止(您看到的代码就是全部,请尝试!)。我也尝试过手动删除侦听器,但这并没有改变。

还有其他我可能没有意识到的事情吗?

迈克·S

添加data事件监听器以process.stdin添加对它的引用,以使进程保持打开状态。即使删除所有事件侦听器,该引用也会保留在原位。您可以unref()在回调中手动进行操作,如下所示:

console.log('Press Enter to allow process to terminate')
process.stdin.once('data', callback)

function callback (data) {
    console.log('Process can terminate now')
    process.stdin.unref()
}

另外,作为用于此类操作的通用调试工具,您可以调用两个(未记录的)函数来获取使进程保持打开状态的列表:

process._getActiveHandles()
process._getActiveRequests()

有关背景,请参见节点项目中的此拉取请求


更新:你问到附加的事件监听器,你已经后unref()“d process.stdin这是一个简单的示例,显示侦听器确实附加了自身并起作用:

console.log('Press Enter to allow process to terminate')
process.stdin.once('data', callback)

function callback (data) {
    console.log('Unreferencing stdin. Exiting in 5 seconds.')
    process.stdin.unref()

    process.stdin.once('data', function(data) {
        console.log('More data')
    })

    setTimeout(function() {
        console.log('Timeout, Exiting.')
    }, 5000);
}

使用该代码,如果您在setTimeout触发(5秒)之前按下另一个键,那么您将看到More data输出到控制台。一旦setTimeout的回调触发,该过程将退出。诀窍是setTimeout创建一个计时器,该进程也将保留一个引用。由于该过程仍然引用某些内容,因此不会立即退出。计时器触发后,它释放的引用就会退出。这也表明,引用是自动添加(和删除)到需要它们的东西的(setTimeout在这种情况下是由计时器创建的)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么 SIGINT 不终止停止的进程?

来自分类Dev

更改侦听器后,为什么不触发我的计算属性?

来自分类Dev

为什么关闭终端仿真器窗口终止SIGHUP陷阱的bash进程已更改为不终止?

来自分类Dev

当没有数据侦听器时,为什么node.js http不调用end事件?

来自分类Dev

如何强行阻止Node.js进程终止?

来自分类Dev

如何终止通过SSH启动的Node.js的NOHUP进程

来自分类Dev

为什么在进程启动的 server.js 中读取证书会导致进程终止?

来自分类Dev

javafx TableView:当我降序排序时,为什么 sortOrder 侦听器不触发?

来自分类Dev

为什么DOM元素仅在事件侦听器完成后才更新?(纯js)

来自分类Dev

SIGHUP是否已发送到该孤立进程,为什么不终止?

来自分类Dev

终止池中的所有进程

来自分类Dev

为什么所有这些过程都结束后Erlang Shell不会终止?

来自分类Dev

父进程终止后如何杀死所有子进程?

来自分类Dev

为什么我的函数返回后不终止?

来自分类Dev

调试启动后终止的进程

来自分类Dev

我无法终止端口进程

来自分类Dev

在 .NET Core 应用程序中可靠地终止通过 cmd 进程启动的 node.js 进程

来自分类Dev

为什么我的循环不终止?

来自分类Dev

为什么我的循环不终止?

来自分类Dev

Ctrl + C进程终止而不终止终端

来自分类Dev

为什么所有快照进程都挂了?

来自分类Dev

为什么选择ctrl + c终止进程?

来自分类Dev

如何终止Python程序的所有进程?

来自分类Dev

为什么我无法终止我的JBoss进程?

来自分类Dev

为什么bash在杀死进程后显示“已终止”?

来自分类Dev

转储进程核心而不终止进程

来自分类Dev

转储进程核心而不终止进程

来自分类Dev

为什么JDialog不触发键侦听器的keyPressed方法?

来自分类Dev

为什么第二个事件侦听器不触发?

Related 相关文章

  1. 1

    为什么 SIGINT 不终止停止的进程?

  2. 2

    更改侦听器后,为什么不触发我的计算属性?

  3. 3

    为什么关闭终端仿真器窗口终止SIGHUP陷阱的bash进程已更改为不终止?

  4. 4

    当没有数据侦听器时,为什么node.js http不调用end事件?

  5. 5

    如何强行阻止Node.js进程终止?

  6. 6

    如何终止通过SSH启动的Node.js的NOHUP进程

  7. 7

    为什么在进程启动的 server.js 中读取证书会导致进程终止?

  8. 8

    javafx TableView:当我降序排序时,为什么 sortOrder 侦听器不触发?

  9. 9

    为什么DOM元素仅在事件侦听器完成后才更新?(纯js)

  10. 10

    SIGHUP是否已发送到该孤立进程,为什么不终止?

  11. 11

    终止池中的所有进程

  12. 12

    为什么所有这些过程都结束后Erlang Shell不会终止?

  13. 13

    父进程终止后如何杀死所有子进程?

  14. 14

    为什么我的函数返回后不终止?

  15. 15

    调试启动后终止的进程

  16. 16

    我无法终止端口进程

  17. 17

    在 .NET Core 应用程序中可靠地终止通过 cmd 进程启动的 node.js 进程

  18. 18

    为什么我的循环不终止?

  19. 19

    为什么我的循环不终止?

  20. 20

    Ctrl + C进程终止而不终止终端

  21. 21

    为什么所有快照进程都挂了?

  22. 22

    为什么选择ctrl + c终止进程?

  23. 23

    如何终止Python程序的所有进程?

  24. 24

    为什么我无法终止我的JBoss进程?

  25. 25

    为什么bash在杀死进程后显示“已终止”?

  26. 26

    转储进程核心而不终止进程

  27. 27

    转储进程核心而不终止进程

  28. 28

    为什么JDialog不触发键侦听器的keyPressed方法?

  29. 29

    为什么第二个事件侦听器不触发?

热门标签

归档