首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js和C/C++集成:如何正确实现回调?

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

Stack Overflow用户
提问于 2015-06-16 08:44:39
回答 1查看 1.8K关注 0票数 4

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

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

( a)使用对JavaScript函数的简单回调。因此,我的扩展必须生成一个线程并立即返回,让该线程调用阻塞代码,然后在返回时调用JavaScript回调。这似乎相对容易实现。

( b)通过使用libuv库,以便(如果我正确理解的话)将一个事件发送到node.js事件循环。我还没有详细阅读libuv文档,但实现起来似乎相当复杂。

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

非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 10:19:40

从不同的线程调用回调不是一个选项,v8不允许这样做。所以你必须和b一起去,这其实并不难实现。我建议在此任务中使用非数。以下是docs的一个示例:

代码语言:javascript
复制
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线程池处理代码调用,并调用主线程上的回调。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30862736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档