【问题标题】:How to prevent a Nan/V8 thread crashing a node host process?如何防止 Nan/V8 线程使节点主机进程崩溃?
【发布时间】:2022-01-14 17:02:30
【问题描述】:

我正在使用 Nan/V8 构建一个本地节点模块,它使用 AsyncWorker 创建异步函数。

如果我的线程崩溃,有没有办法保护节点主机应用程序不死?每个 worker 执行的数据都是纯本地的,所以最坏的情况是内存泄漏,但我需要保护主机应用程序不崩溃。

【问题讨论】:

    标签: node.js nan v8


    【解决方案1】:

    崩溃通常是每个进程的事件。没有办法让单个线程崩溃并让同一进程中的其他线程继续存在。

    FWIW,这与 Node/Nan/V8 无关。这是所有现代浏览器都使用多进程架构的关键原因之一。

    当然,从多线程应用程序切换到多进程模型是有代价的:与其他进程交换数据(IPC,“进程间通信”)通常比在内部协调几个线程更麻烦一个进程。

    也就是说,人们有时使用“崩溃”这个词的含义有些不同,所以这里可能还有其他答案。例如。从 JavaScript 的角度来看,未处理的异常可以被描述为“崩溃”——这很容易处理和恢复,甚至没有线程必须为此而死。

    此外,应用程序实际上必须处理崩溃进程的情况非常少见(浏览器就是一个例子);大多数时候,开发人员的时间最好花在确保不会发生崩溃上,而不是在发生崩溃时尝试处理它们。节点本身应该足够稳定,不会崩溃;对于你自己的模块,设计(和调试,如果需要的话:-))它不会崩溃可能比设计(和测试)一个让它优雅地处理崩溃的方案更可行/更有效。

    【讨论】:

    • 感谢您的意见。如果线程死亡,您实际上可以防止操作系统终止主机应用程序。您可以在 Windows、macOS 和 Linux 上注册错误和崩溃处理程序,这些处理程序利用 longjump 跳回避风港。您当然有内存泄漏,但正如我所说的那样,崩溃的线程并不一定意味着主机应用程序的死亡,因为我自己已经这样做了,但它已经太多年前了,我不确定节点中是否有抽象方式或 NAN 世界
    • @HelloWorld - 是的,但这意味着服务器状态的某些部分处于不确定的位置。内存、文件句柄和其他资源可能被搁置/泄漏,当然,该线程本身处于完全不确定的状态。在某些情况下,影响其他线程的资源(如互斥锁或其他类型的锁)也可能会受到影响。防止发生然后重新启动是知道您可以干净地继续进行的唯一方法。
    • 感谢您的确认。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2017-01-26
    • 2012-03-07
    • 2013-05-30
    相关资源
    最近更新 更多