1

这个有点奇怪……

我编写了一个大多数时候运行良好的 NodeJS 本机模块,但是该类包含一个在共享内存的上下文中运行时会破坏模块的方法。

粗略地说,该模块打开了一个 IO 服务器,但是有一个错误需要我打开和关闭 IO 服务器以检索特定值...当我执行此操作时,找到引用旧 IO 服务器对象的任何指针显然会中断/ segfault(“涂鸦空间”错误,对吧?)。

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

作为记录,我尝试使用 Libuv 线程来运行该方法,但我遇到了同样的问题。我猜那是因为函数调用仍然是在共享内存中进行的。

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

4

1 回答 1

2

您不能将一种方法干净利落地撕成一个新流程。可能您应该做的是编写一点点 C++ 胶水作为节点模块并启动一个单独的进程作为服务器。然后,您可以通过套接字(或 unix 套接字,或在您的目标操作系统上工作的任何东西)与该进程通信。

如果您真的遇到内存损坏错误,您将希望将坏代码隔离到一个单独的进程中,这样当它出现故障时,它不会取出主节点进程——只是支持您需要的小型服务器。

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

  1. 使用 NaN(Node 的本机抽象)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 库可以从节点使用。

于 2014-04-14T04:02:29.113 回答