c++ - Node JS native 模块 : Can You Run C/C++ Methods In A Separate Libuv/NodeJS Style Process?

标签 c++ multithreading node.js process libuv

这有点奇怪......

我编写了一个在大多数情况下都运行良好的 NodeJS native 模块,但该类包含一个方法,当它在共享内存的上下文中运行时会破坏模块。

粗略地说,该模块打开一个 IO 服务器,但有一个错误要求我打开和关闭 IO 服务器以检索特定值...当我执行此操作时,发现任何指向旧 IO 服务器对象的指针显然是 break/segfault(一个“scribble space”错误,对吧?)。

为了解决这个问题,我目前使用 NodeJS 的 child_process.fork() 在隔离的上下文中运行错误的方法,并在主进程和 fork 进程之间传递消息以使程序按要求运行(即我调用 fork 过程中的方法,并使用 'process.on("message", ...)' 来检索结果)。这很好用,但感觉像是一个非常昂贵的 hack...

郑重声明,我曾尝试使用 Libuv 线程来运行该方法,但我遇到了同样的问题。我猜这是因为函数调用仍在共享内存中进行。

我是否可以使用 C++ 在“NodeJS 风格”进程​​中运行一小部分(或更多...)C/C++ 代码?

最佳答案

您不能将单一方法干净地剥离到新流程中。可能您应该做的是编写一点点 C++ 胶水作为 Node 模块,然后启动一个单独的进程作为服务器。然后您可以通过套接字(或 unix 套接字,或任何适用于您的目标操作系统的套接字)与该进程通信。

如果你真的遇到了内存损坏错误,你会希望将错误代码隔离到一个单独的进程中,这样当它崩溃时它不会取出主 Node 进程 - 只是支持什么的微型服务器你需要。

为 Node 编写 C++ 扩展非常容易 - 我是一名经验丰富的 C++ 程序员,刚接触 javascript,我最近才开始这样做。这里有几个提示——

  1. 使用 NaN(Node 的 native 抽象)https://github.com/rvagg/nan保护您免受 0.10 -> 0.11 -> 0.12 迁移中的更改

  2. 通过教程 ( http://nodejs.org/api/addons.html) “困难的方式”,即输入每个示例并构建它。

  3. 使用 C++ 单元测试库

我正在完善(但已经运行良好)的项目示例如下:https://github.com/smikes/inchi InChI 是代表分子的标准;这使得 C/C++ InChI 库可以从 Node 使用。

关于c++ - Node JS native 模块 : Can You Run C/C++ Methods In A Separate Libuv/NodeJS Style Process?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23050391/

相关文章:

c++ - 使用带有 CMake 和 Conan 的外部库的 undefined reference

c++ - 类型名称后的括号是否与 new 有所不同?

c++ - 调试捕获此的 lambda

ios - 第一次没有收到推送通知

javascript - 使用错误的 MIME 类型快速发送 Assets

c++ - 从启动时保留的内存写入时,内核 AIO (libaio) 写入请求失败

c - 进程的线程级内存消耗

Php:何时使用 pthread

node.js - 增加 Mongoose 数字字段的优雅方法

java - 在java中分几个部分或片段下载文件