1. ホーム
  2. node.js

[解決済み] Node.jsのノンブロッキング、非同期I/Oとは何ですか?

2022-05-03 03:16:16

質問

サーバーサイドの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番目のキューからコールバックをピックアップして実行するのです。