4

node.js と統合する C++ 拡張機能を実装しようとしています。この拡張機能は、いくつかのブロッキング呼び出しを内部的に呼び出すため、node.js ワールドへのノンブロッキング インターフェイスを提供する必要があります。

https://nodejs.org/api/addons.htmlで指定されているように、ノンブロッキング コールバックを実装するには 2 つの方法があります。

a) JavaScript 関数への単純なコールバックを使用する。したがって、私の拡張機能は、スレッドを生成してすぐに戻り、そのスレッドにブロッキング コードを呼び出させ、戻り時に JavaScript コールバックを呼び出す必要があります。これは比較的簡単に実装できるようです。

b)libuvライブラリを使用して、私が正しく理解していれば、イベントをnode.jsイベントループに投稿します。libuv のドキュメントを詳しく読んだことはありませんが、これを実装するのは非常に複雑に思えます。

もちろん、私の好みはa)ですが、その意味がわかりません。コールバックが別のスレッドから呼び出され、非ブロッキング IO への node.js 標準アプローチを回避する場合、問題はありますか? または、コードのスレッド化とそのブロッキング呼び出しを適切に処理するために libuv を使用する必要がありますか?

ご助力ありがとうございます。

4

1 に答える 1

6

別のスレッドからコールバックを呼び出すことはオプションではありません。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 スレッド プールを使用してコードを呼び出し、メイン スレッドでコールバックを呼び出します。

于 2015-06-16T10:19:40.037 に答える