【问题标题】:How can I attach an event handler to the process's exit in a native Node.js module?如何在本机 Node.js 模块中将事件处理程序附加到进程的出口?
【发布时间】:2015-06-06 09:24:58
【问题描述】:

我正在为原生 Node.js 模块实现正确的内存管理。我遇到了这个问题中描述的问题:
node.js native addon - destructor of wrapped class doesn't run

建议的解决方案是将本机对象的析构函数绑定到process.on('exit'),但答案不包含如何在本机模块中执行此操作。

我也简要查看了 libuv 文档,但它们也没有包含任何在这方面有用的内容。

注意:我对获取 process 对象并不是特别感兴趣,但我尝试过这样做:

auto globalObj = NanGetCurrentContext()->Global();
auto processObj = ::v8::Handle<::v8::Object>::Cast(globalObj->Get(NanNew<String>("process")));
auto processOnFunc = ::v8::Handle<::v8::Function>::Cast(processObj->Get(NanNew<String>("on")));
Handle<Value> processOnExitArgv[2] = { NanNew<String>("exit"), NanNew<FunctionTemplate>(onProcessExit)->GetFunction() };
processOnFunc->Call(processObj, 2, processOnExitArgv);

然后的问题是我在尝试删除我的对象时收到此消息:

Assertion `persistent().IsNearDeath()' failed.

我也尝试使用std::atexit 并得到相同的断言错误。

到目前为止,我能做的最好的事情是在std::set 中收集流浪的ObjectWrap 实例并清理被包装的对象,但由于上述错误,我无法自己清理包装器。

那么,我该如何正确地做到这一点呢?

【问题讨论】:

  • 您的问题是关于注册处理程序还是关于获取process 对象?您使用的是什么版本的 node.js(您是要定位 0.10.x0.12.x 还是两者)?
  • @t.niese 我对获取process 对象不感兴趣,只是为了能够在 v8 停止时注册一个事件,这样我就可以删除 v8 的 GC 没有删除的对象.我更喜欢适用于多个节点版本的解决方案,但我使用 0.12.x
  • 即使在 V8 内部有一个内部/直接的方式来监听退出,我仍然会使用你在 js 中做的等效方式,直接在process.on('exit') 上注册一个事件处理程序。因此,您需要获取 process 对象并在其上调用 on 函数,传递您的包装回调。
  • 要创建可以在不同版本的节点上运行的模块,你应该看看nan,因为不同版本的节点之间有很大的变化。
  • @t.niese 我已经在使用 Nan,是的。

标签: javascript c++ node.js node.js-addon


【解决方案1】:

我也收到了"Assertion persistent().IsNearDeath()' failed" 消息。

有一个 node::AtExit() 函数在 Node.js 关闭之前运行 - 相当于 process.on('exit')

在您的插件的 init 函数中(或任何合适的地方)将回调函数传递给 node::AtExit

这里记录了该函数: https://nodejs.org/api/addons.html#addons_atexit_hooks

例如:

NAN_MODULE_INIT(my_exports)
{
// other exported stuff here
    node::AtExit(my_cleanup);
}

NODE_MODULE(my_module, my_exports) //add-on exports

//call C++ dtors:
void my_cleanup()
{
    delete my_object_ptr; //call object dtor, or other stuff that needs to be cleaned up here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2012-10-23
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多