【发布时间】:2022-01-14 17:02:30
【问题描述】:
我正在使用 Nan/V8 构建一个本地节点模块,它使用 AsyncWorker 创建异步函数。
如果我的线程崩溃,有没有办法保护节点主机应用程序不死?每个 worker 执行的数据都是纯本地的,所以最坏的情况是内存泄漏,但我需要保护主机应用程序不崩溃。
【问题讨论】:
我正在使用 Nan/V8 构建一个本地节点模块,它使用 AsyncWorker 创建异步函数。
如果我的线程崩溃,有没有办法保护节点主机应用程序不死?每个 worker 执行的数据都是纯本地的,所以最坏的情况是内存泄漏,但我需要保护主机应用程序不崩溃。
【问题讨论】:
崩溃通常是每个进程的事件。没有办法让单个线程崩溃并让同一进程中的其他线程继续存在。
FWIW,这与 Node/Nan/V8 无关。这是所有现代浏览器都使用多进程架构的关键原因之一。
当然,从多线程应用程序切换到多进程模型是有代价的:与其他进程交换数据(IPC,“进程间通信”)通常比在内部协调几个线程更麻烦一个进程。
也就是说,人们有时使用“崩溃”这个词的含义有些不同,所以这里可能还有其他答案。例如。从 JavaScript 的角度来看,未处理的异常可以被描述为“崩溃”——这很容易处理和恢复,甚至没有线程必须为此而死。
此外,应用程序实际上必须处理崩溃进程的情况非常少见(浏览器就是一个例子);大多数时候,开发人员的时间最好花在确保不会发生崩溃上,而不是在发生崩溃时尝试处理它们。节点本身应该足够稳定,不会崩溃;对于你自己的模块,设计(和调试,如果需要的话:-))它不会崩溃可能比设计(和测试)一个让它优雅地处理崩溃的方案更可行/更有效。
【讨论】: