[解決済み] Node.jsのイベントループティックとは何ですか?
質問
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++ ライブラリ呼び出しを非同期に見せかけることができます。
関連
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsで環境変数を読み込む
-
[解決済み] Node.js + Nginx - 今度は何?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】AWS STS AssumeRoleへのアクセスを可能にする方法
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み】エラー TRK0005: 位置特定に失敗しました。"CL.exe"
-
[解決済み】Node.jsのホスト名/IPが証明書のaltnamesと一致しない。
-
webpack ENOENTソリューションの起動
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] ReferenceError: describe は定義されていません NodeJs
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] イベントループを理解する