【问题标题】:Node kill thread but not process节点杀死线程但不是进程
【发布时间】:2015-03-22 09:58:20
【问题描述】:

我想知道你是否可以只终止节点应用程序正在执行的线程而不是进程。

现在,我知道这听起来很奇怪,因为节点是单线程的,但我正在开发一个在进程中托管节点的 .NET 应用程序。当我用process.exit() 终止节点时,整个应用程序都会关闭,这是我不想要的行为。我只想终止节点线程。

老实说,我非常绝望,我什至尝试过,在创建节点正在执行的线程之前获取所有应用程序线程的列表,然后在创建之后获取另一个列表,然后删除在启动节点之前存在的所有线程,保持对剩余线程的引用,认为它是节点线程。正如你所料,结果并不那么好。

我正在使用 EdgeJS 来托管节点,如果这有什么不同的话。不幸的是,它没有内置的功能来终止自身。

哦,由于某种原因,server.close() 对我不起作用。

如果该信息对您有任何帮助,我将在我的节点代码中托管一个视频流服务器。

提前感谢所有帮助!

【问题讨论】:

  • 你“欺骗”不起作用的原因是它看起来像你正在运行你的 node.js 进程。也就是说,根本不在线程中。因此,除了您的 .NET 应用程序之外,运行 node.js 的线程完全为零。
  • EdgeJS 库(在 .NET 中)创建了一个单独的线程来运行其中的节点代码。
  • 你确定吗?我快速浏览了文档,并没有在任何地方看到它。
  • 我用了一个简单的方法来测试这个。我在托管代码中启动了一个新线程,它只执行我的 .net 代码,它启动 EdgeJS 并执行 node.js 代码。我关闭了那个线程,我的节点服务器还活着。所以我认为必须有一个新的线索在起作用,因为这是唯一可能发生的方式。不是 100% 确定,但很确定这是一个新线程。

标签: node.js multithreading terminate


【解决方案1】:

节点线程需要通过清除事件循环上运行的所有内容来进行协作,然后通过返回自然终止。因此,只需停止监听请求、关闭句柄等。您可以使用 process._getActiveRequestsprocess._getActiveHandles 来查看是什么让事件循环保持活动状态。

您也可以仅通过调用 OS api 来突然中断节点线程,但这会泄漏大量垃圾,直到您退出进程,因此在您需要退出进程以释放之前,您无法多次启动/重新启动节点泄露的资源。

【讨论】:

  • 我尝试通过 OS API 关闭线程,但无法查明/引用线程。 process._getActiveRequests()process._getActiveHandles() 的任何文档,因为它们似乎不在官方 api 文档中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多