【问题标题】:nodejs native addon multithreadingnodejs原生插件多线程
【发布时间】:2015-12-26 21:53:26
【问题描述】:

我在一段时间内为 nodejs 开发了本机模块,有些情况对我来说不是很清楚。不幸的是,v8 文档不是很好。

所以有一个对我来说很有趣的领域。 首先,是否可以在主本机模块线程中使用std::thread?文档说我可以使用 libuv 函数并运行异步操作,但是在这个库中我们无法访问 v8 对象。但是,如果我想在主线程中同步计算并行计算,例如,修改一些 JS 对象属性并将其结果放在另一个线程中呢?

我尝试了以下代码:

double result;
void myFunction(Local<Value> a, Local<Value> b)
{
    std::cout << "from thread " << std::this_thread::get_id() << " " << std::endl;
    result = a->NumberValue() + b->NumberValue();
}
void add(const FunctionCallbackInfo<Value>& args)
{
  Isolate* isolate = args.GetIsolate();
  std::cout << "main "<< std::this_thread::get_id() << std::endl;
  thread thread(myFunction, args[0], args[1]);
  thread.join();
  args.GetReturnValue().Set(Number::New(isolate, result));
}

它按我的预期工作,但如果我们无法在另一个线程中访问 v8 对象,为什么?

我也尝试将结果更改为 v8::Number 类型并通过当前隔离和新隔离在 myFunction 中创建它,但出现 seg 错误。

【问题讨论】:

  • 您是否使用互斥锁来更改全局对象?在这种情况下,通常会导致段错误。有一个很好的插件可以捕获段错误github.com/ddopson/node-segfault-handler,这是一个库,它也使用 std::threads github.com/yarax/nnb
  • @RaxWunter 我同意第二个例子的架构,当我们在主 JS 事件循环中提取数据时,通过它们填充 C++ 结构,运行异步函数并在另一个事件循环中使用任何线程号执行。好的,但我想,如果应对和形成 C++ 结构不是轻量级操作,是否可以通过从这 N 个线程(不是另一个事件循环,只是线程)运行来操作主 JS 事件循环中的 JS 对象。而且我发现使用 libuv 不是(如文档中所述),但使用例如 c++11 线程我可以将 Local 引用转发到线程中,这很有效。

标签: c++ node.js multithreading v8 node.js-addon


【解决方案1】:

@RaxWunter 换句话说,我不明白为什么这样的代码可以工作

void myFunction(Local<Value> a, Local<Value> b, Isolate* pIsolate, Local<Number>& num)
{
    cout << "from thread " << this_thread::get_id() << " " << pIsolate << endl; 
    num = Number::New(pIsolate, a->NumberValue() + b->NumberValue()); 
} 
void add(const FunctionCallbackInfo<Value>& args)
{ 
    Isolate* isolate = args.GetIsolate(); 
    Local<Number> num; 
    thread thread1(myFunction, args[0], args[1], isolate, std::ref(num));
    thread1.join(); 
    args.GetReturnValue().Set(num); 
}
void Init(Local<Object> exports) 
{
    NODE_SET_METHOD(exports, "add", add);
}
NODE_MODULE(addon, Init)

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多