[解決済み] Node.jsのノンブロッキング、非同期I/Oとは何ですか?
質問
サーバーサイドのJavascriptエンジンの文脈では、ノンブロッキングI/Oまたは非同期I/Oとは何ですか?私は、これがJavaサーバーサイド実装に対する利点として言及されているのを見ます。
どのように解決するの?
同期と非同期
同期実行は通常、コードが順番に実行されることを指します。非同期実行とは、コードに現れる順番通りに実行されない実行を指します。次の例では、同期実行によってアラートが順番に発火します。非同期実行では
alert(2)
は2番目に実行されるように見えますが、そうではありません。
同期: 1,2,3
alert(1);
alert(2);
alert(3);
非同期式:1,3,2
alert(1);
setTimeout(() => alert(2), 0);
alert(3);
ブロッキングとノンブロッキング
ブロッキングとは、その操作が終了するまで、それ以降の実行をブロックする操作を指します。ノンブロッキングは、実行をブロックしないコードを指します。与えられた例では
localStorage
は、読み込みのために実行を停止させるので、ブロッキング操作となります。一方
fetch
を停止させないので、ノンブロッキング操作です。
alert(3)
を実行から切り離します。
// Blocking: 1,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);
// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);
メリット
ノンブロッキング、非同期処理の利点として、1つのCPUとメモリを最大限に活用できることが挙げられます。
同期、ブロッキングの例
同期、ブロック操作の例として、JavaやPHPなどのウェブサーバーがIOやネットワークリクエストを処理する方法があります。もしあなたのコードがファイルやデータベースから読み取る場合、あなたのコードはそれ以降の全ての実行をブロック"quot;します。この間、マシンはメモリとスレッドの処理時間を保持することになります。 何もしていない .
スレッドが停止している間に他のリクエストに対応するためには、お使いのソフトウェアに依存します。ほとんどのサーバソフトウェアが行うことは、追加のリクエストに対応するためにさらにスレッドを生成することです。このため、より多くのメモリを消費し、より多くの処理を行う必要があります。
非同期、ノンブロッキングの例
Nodeで作られたような非同期、ノンブロッキングのサーバは、すべてのリクエストに対応するために1つのスレッドだけを使用します。これはNodeのインスタンスがシングルスレッドを最大限に活用することを意味します。作成者は、I/Oとネットワーク操作がボトルネックであることを前提に設計しました。
サーバーにリクエストが届くと、1つずつ処理されます。しかし、例えばDBへの問い合わせが必要な場合は、2つ目のキューにコールバックを送ります。 を実行し、メインスレッドは実行を継続します。 (待ちません)。さて、DB操作が完了して戻ると、対応するコールバックは2番目のキューから引き出され、3番目のキューにキューイングされ、そこで実行が保留されます。エンジンが何か他のことを実行する機会を得ると(実行スタックが空になったときなど)、3番目のキューからコールバックをピックアップして実行するのです。
関連
-
[解決済み] NodeJsのSequelizeでautoIncrementはどのように動作するのですか?
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] npm installの-saveオプションは何ですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] 非同期呼び出しとノンブロッキング呼び出し? ブロッキングと同期呼び出しの間にも
-
[解決済み] JavaScript, Node.js: Array.forEachは非同期なのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み】nodemon - app crashed - waiting for file changes before start
-
[解決済み】passport.js passport.initialize() ミドルウェアが使用されていません。
-
webpack ENOENTソリューションの起動
-
[解決済み] Heroku "状態が起動から停止に変更されました SIGTERMで全プロセスを停止"
-
[解決済み] nodejs - http.requestでresponse.writeを使用する場合、第一引数は文字列またはBufferでなければなりません。
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] エラーメッセージ MongoError: bad auth URI 文字列で認証に失敗しました。
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み] 非同期呼び出しとノンブロッキング呼び出し? ブロッキングと同期呼び出しの間にも