1. ホーム
  2. node.js

[解決済み] Node.jsのイベントループティックとは何ですか?

2023-01-02 02:19:46

質問

Node.js アーキテクチャの内部をより深く理解するようになり、よく出てくる用語が "tick" イベントループの次の tick" や、関数 nextTick() .

私が見たことがないのは、正確に "tick" が何であるかの確かな定義です。さまざまな記事に基づいて ( このような ) をもとに、私の頭の中でコンセプトを構築することができましたが、それがどれほど正確なものかはわかりません。

Node.jsのイベントループティックについて、正確で詳細な説明を受けることはできますか?

どのように解決するのですか?

JavaScript はシングルスレッドですが、node の I/O とネイティブ API の呼び出しはすべて非同期 (プラットフォーム固有のメカニズムを使用) であるか、別のスレッドで実行されることを覚えておいてください。 (これはすべて libuv を通して処理されます)。

したがって、ソケットで利用可能なデータがあるとき、またはネイティブ API 関数が返されたとき、ちょうど起こった特定のイベントに関心のある JavaScript 関数を呼び出すための同期化された方法が必要です。

競合状態、非アトミックメモリアクセスなど、通常のマルチスレッドアプリケーションで遭遇するのと同じ理由で、ネイティブイベントが発生したスレッドからJS関数を呼び出すことは安全ではありません。

そこで私たちが行うことは、スレッドセーフな方法でキューにイベントを配置することです。 簡略化した擬似コードでは、次のようなものです。

lock (queue) {
    queue.push(event);
}

次に、メインのJavaScriptに戻り スレッド (ただしC側)で、次のようなことをします。

while (true) {
    // this is the beginning of a tick

    lock (queue) {
        var tickEvents = copy(queue); // copy the current queue items into thread-local memory
        queue.empty(); // ..and empty out the shared queue
    }

    for (var i = 0; i < tickEvents.length; i++) {
        InvokeJSFunction(tickEvents[i]);
    }

    // this the end of the tick
}

while (true) (これは純粋に例示であり、実際にはnodeのソースコードには存在しません) は イベントループ . 内側の for は、キューに登録された各イベントの JS 関数を呼び出します。

これはtickと呼ばれるもので、任意の外部イベントに関連する0個以上のコールバック関数を同期的に呼び出すものです。 キューが空になり、最後の関数が返されると、tickは終了します。 私たちは最初(次のティック)に戻り、他のスレッドからキューに追加されたイベントをチェックします。 JavaScript が実行されている間に .

何がキューに物を追加できるのか?

  • process.nextTick
  • setTimeout / setInterval
  • I/O(以下 fs , net など)
  • crypto 暗号ストリーム、pbkdf2、および PRNG のようなプロセッサ集約的な関数 (これは実際には例として...) です。
  • を使用するすべてのネイティブモジュール。 libuv ワークキュー を使って同期 C/C++ ライブラリ呼び出しを非同期に見せかけることができます。