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

路易斯·克雷斯波

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

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

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

b)如果我理解正确,请使用libuv库将事件发布到node.js事件循环。我没有详细阅读libuv文档,但这实现起来似乎很复杂。

我的偏好当然是a),但是我不知道其中的含义。如果从其他线程调用回调,从而将node.js标准方法塞入非阻塞IO,会出现任何问题吗?还是需要使用libuv来正确处理我的代码及其阻塞调用的线程?

非常感谢您的帮助。

vkurchatkin

从其他线程调用回调不是一种选择,v8不允许这样做。因此,您必须选择b。实际上实现起来并不难。我建议将nan用于此任务。这是docs中的示例:

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线程池处理代码并在主线程上调用回调。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何通过在node.js中读取流来正确实现回调逻辑?

来自分类Dev

C ++如何实现回调?

来自分类Dev

如何正确实现C ++类的析构函数

来自分类Dev

如何在C中正确实现strcpy?

来自分类Dev

如何正确实现三巨头:单链接列表(C ++)

来自分类Dev

如何正确实现c malloc / realloc函数?

来自分类Dev

适用于Azure Functions的Node.js vs C#:如何选择性能和集成

来自分类Dev

如何实现从Java调用到C ++的回调函数?

来自分类Dev

如何使用swift实现C-Style回调函数?

来自分类Dev

OpenCL C ++绑定:如何为enqueueWriteBuffer竞争实现回调

来自分类Dev

如何使用swift实现C-Style回调函数?

来自分类Dev

C#正确实现Equals方法以及如何实现GetHashCode方法

来自分类Dev

如何在node.js中使用混合的C ++和.Net dll?(错误:abort()已被调用)

来自分类Dev

比较Node.js C ++ Addon的速度和等效的JS?

来自分类Dev

如何返回Node.js回调

来自分类Dev

如何使用node.js在AWS RDS PostgreSQL上实现回调

来自分类Dev

对如何在node.js中实现异步回调感到困惑

来自分类Dev

如何使用node.js在AWS RDS PostgreSQL上实现回调

来自分类Dev

如何在C ++中正确实现仅由抽象库已知的对象列表的创建(和分配)?

来自分类Dev

如何正确实现在Cuda / C ++中从主机和设备代码中调用其成员的类?

来自分类Dev

如何通过平均无符号字符来正确实现此操作-C ++

来自分类Dev

如何在Node.js中正确实现“忘记/重置密码”功能?(使用一次令牌)

来自分类Dev

在c ++ 11中,线程是否类似于node.js / javascript回调?

来自分类Dev

在node.js代码中实现回调的问题

来自分类Dev

node.js回调的正确控制流程是什么?

来自分类Dev

正确处理Node.js TLS服务器和C TLS客户端(openSSL)连接的方法

来自分类Dev

正确处理Node.js TLS服务器和C TLS客户端(openSSL)连接的方法

来自分类Dev

在Node.js(异步)中的循环和回调中寻找正确的模式

来自分类Dev

node *和node *&c ++之间的区别

Related 相关文章

  1. 1

    如何通过在node.js中读取流来正确实现回调逻辑?

  2. 2

    C ++如何实现回调?

  3. 3

    如何正确实现C ++类的析构函数

  4. 4

    如何在C中正确实现strcpy?

  5. 5

    如何正确实现三巨头:单链接列表(C ++)

  6. 6

    如何正确实现c malloc / realloc函数?

  7. 7

    适用于Azure Functions的Node.js vs C#:如何选择性能和集成

  8. 8

    如何实现从Java调用到C ++的回调函数?

  9. 9

    如何使用swift实现C-Style回调函数?

  10. 10

    OpenCL C ++绑定:如何为enqueueWriteBuffer竞争实现回调

  11. 11

    如何使用swift实现C-Style回调函数?

  12. 12

    C#正确实现Equals方法以及如何实现GetHashCode方法

  13. 13

    如何在node.js中使用混合的C ++和.Net dll?(错误:abort()已被调用)

  14. 14

    比较Node.js C ++ Addon的速度和等效的JS?

  15. 15

    如何返回Node.js回调

  16. 16

    如何使用node.js在AWS RDS PostgreSQL上实现回调

  17. 17

    对如何在node.js中实现异步回调感到困惑

  18. 18

    如何使用node.js在AWS RDS PostgreSQL上实现回调

  19. 19

    如何在C ++中正确实现仅由抽象库已知的对象列表的创建(和分配)?

  20. 20

    如何正确实现在Cuda / C ++中从主机和设备代码中调用其成员的类?

  21. 21

    如何通过平均无符号字符来正确实现此操作-C ++

  22. 22

    如何在Node.js中正确实现“忘记/重置密码”功能?(使用一次令牌)

  23. 23

    在c ++ 11中,线程是否类似于node.js / javascript回调?

  24. 24

    在node.js代码中实现回调的问题

  25. 25

    node.js回调的正确控制流程是什么?

  26. 26

    正确处理Node.js TLS服务器和C TLS客户端(openSSL)连接的方法

  27. 27

    正确处理Node.js TLS服务器和C TLS客户端(openSSL)连接的方法

  28. 28

    在Node.js(异步)中的循环和回调中寻找正确的模式

  29. 29

    node *和node *&c ++之间的区别

热门标签

归档