2

libUV を使用して C node.js アドオンを作成し、アドオンを非同期にしました。

このためにいくつかのキューを作成しました。

コードは次のようにloopArrayなり、これらのキューを格納するために使用されます。

//... variables declarations

void AsyncWork(uv_work_t* req) {
    // ...
}

void AsyncAfter(uv_work_t* req) {
    // ...
}

Handle<Value> RunCallback(const Arguments& args) {
    // ... some preparation work

    int loopNumber = (rand() % 10);
    int status = uv_queue_work(loopArray[loopNumber], &baton->request, AsyncWork, AsyncAfter);
    uv_run(loopArray[loopNumber]);
    return Undefined();

}


extern "C" {
    static void Init(Handle<Object> target) {
        int i = 0;
        for (i = 0; i< 10; i++){
            loopArray[i] = uv_loop_new();
        }           

        target->Set(String::NewSymbol("callback"), FunctionTemplate::New(RunCallback)->GetFunction());
    }
}

NODE_MODULE(addon, Init)

問題は、CPU を大量に消費するタスク用に 10 個のキューを作成したとしてもです。node.js は、キューの 1 つを処理している間、タスクを切り替えません。node.js のシングルスレッドの性質によるものですか?

そうですか、uv_thread_create は状況に役立ちますか?

このためのコード サンプルが見つからないため、使用方法がわかりません。

ありがとう!

4

1 に答える 1

4

これがノードのアーキテクチャの背後にある主なアイデアです。スレッドを使用して複数のジョブを並行して処理する代わりに、関数呼び出し (バック) とメイン イベント ループを使用してそれらを実行します。

やりたいことがジョブのキューを処理することである場合、それを行うための最良の方法は、一度に 1 つのジョブを実行することです。システムで複数の CPU コアを使用することは、スレッドではなく複数のノード インスタンスによって行われます。これには child_process と cluster node モジュールがあります。

複数のスレッドを作成する場合、作業のために 10 個のスレッドを実行したいとします。システムに 8 つの CPU コアがある場合、オペレーティング システムのスケジューラに不要な作業を与えることでパフォーマンスを低下させます。これは、考慮すべき非常に重要なポイントです。コアが 8 つある場合、最大のパフォーマンスが必要な場合は、並列に 8 つを超えるスレッドを作成しないでください。

ノードの場合、1 つのプロセスで複数のキューまたはスレッドを作成しようとはしません。代わりに、複数のノード プロセスを使用します。これも、コアごとに最大 1 つのプロセスです。

すでに存在するキューを処理する場合。この種の作業では、C モジュールを非同期にする必要はありません。

Web サーバーでの http リクエストのように、外部からのジョブがある場合は、非同期動作が必要です。Web サーバーでは、私たちの仕事は制御できない方法で行われます。人々や他のマシンはいつでもサーバーに接続し、私たちはそれぞれにできるだけ早く応答したいと考えています。このため、リクエストで他のユーザーをブロックすることは望ましくありません。できるだけ多くのリクエストを並行して処理する必要があります。

ただし、データベース テーブルの行で実行している場合や、パラメーターの長いリストに対して何らかの計算を行っている場合は、まったく異なる種類のビジネスを行っています。目の前にジョブ キューがあり、管理方法を待っています。あなたの仕事は、あなたが制御できない方法であなたのシステムにやってくるわけではありません。この種のビジネスでは、究極の効率に到達し、最高の利益を得るには、ジョブを切り替えずに次々と実行する必要があります。並列処理は、複数のコアがあり、それらを使用する場合にのみ有効です。ノードのベスト プラクティスは、複数のノード プロセスを使用することです。

于 2012-06-27T16:28:03.830 に答える