Node.js 和 C/C++ 集成:如何正确实现回调?

Node.js and C/C++ integration: how to properly implement callbacks?

我正在尝试实现与 node.js 集成的 C++ 扩展。此扩展将在内部调用一些阻塞调用,因此它需要为 node.js 世界提供一个非阻塞接口。

https://nodejs.org/api/addons.html中所述,有两种实现非阻塞回调的方法:

a) 通过对 JavaScript 函数使用简单的回调。所以我的扩展必须立即生成一个线程和 return,让该线程调用阻塞代码,然后在 return 上调用 JavaScript 回调。这看起来比较容易实现。

b) 通过使用 libuv 库,如果我理解正确的话,post 一个事件到 node.js 事件循环。我没有详细阅读 libuv 文档,但这实现起来似乎很复杂。

我的偏好当然是 a),但我不知道这意味着什么。如果回调是从不同的线程调用的,是否有任何问题,从而绕过 node.js 非阻塞 IO 的标准方法?或者是否需要使用 libuv 来正确处理我的代码及其阻塞调用的线程?

非常感谢您的帮助。

从不同的线程调用回调不是一个选项,v8 不允许这样做。所以你必须和b一起去。其实实现起来并没有那么难。我建议使用 nan 来完成这项任务。这是来自文档的示例:

class PiWorker : public NanAsyncWorker {
 public:
  PiWorker(NanCallback *callback, int points)
    : NanAsyncWorker(callback), points(points) {}
  ~PiWorker() {}

  // Executed inside the worker-thread.
  // It is not safe to access V8, or V8 data structures
  // here, so everything we need for input and output
  // should go on `this`.
  void Execute () {
    estimate = Estimate(points);
  }

  // Executed when the async work is complete
  // this function will be run inside the main event loop
  // so it is safe to use V8 again
  void HandleOKCallback () {
    NanScope();

    Local<Value> argv[] = {
        NanNull()
      , NanNew<Number>(estimate)
    };

    callback->Call(2, argv);
  };

 private:
  int points;
  double estimate;
};

// Asynchronous access to the `Estimate()` function
NAN_METHOD(CalculateAsync) {
  NanScope();

  int points = args[0]->Uint32Value();
  NanCallback *callback = new NanCallback(args[1].As<Function>());

  NanAsyncQueueWorker(new PiWorker(callback, points));
  NanReturnUndefined();
}

在后台,它将处理使用 libuv 线程池调用您的代码并在主线程上调用回调。