我正在尝试实现一个与 Node.js 集成的 C++ 扩展。该扩展将在内部调用一些阻塞调用,因此它需要为 Node.js 世界提供一个非阻塞接口。
如指定https://nodejs.org/api/addons.html https://nodejs.org/api/addons.html,有两种方法可以实现非阻塞回调:
a) 通过使用 JavaScript 函数的简单回调。因此,我的扩展必须生成一个线程并立即返回,并让该线程调用阻塞代码,然后在返回时调用 JavaScript 回调。这看起来实施起来相对简单。
b) 通过使用 libuv 库,如果我理解正确的话,将事件发布到 node.js 事件循环。我没有详细阅读 libuv 文档,但这似乎实现起来相当复杂。
我当然更喜欢a),但我不知道这意味着什么。如果从不同的线程调用回调,从而破坏 Node.js 非阻塞 IO 的标准方法,是否会出现任何问题?或者是否需要使用 libuv 来正确处理我的代码及其阻塞调用的线程?
非常感谢您的帮助。
从不同的线程调用回调不是一个选项,v8 不允许这样做。所以你必须选择b。实际上实施起来并不难。我建议使用nan https://github.com/nodejs/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 线程池调用您的代码并在主线程上调用回调。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)