はじめに
Node.jsを使っていると、「ノンブロッキング」「非同期」といった言葉をよく目にします。これらの言葉、特に「ノンブロッキング」って何だろう?と思うかもしれません。
結論から言うと、「ノンブロッキング」は、I/O操作(入力/出力操作)を非同期的に処理する仕組みのことで、Node.jsは他の処理を待つことなく並行して動き続けることができる!
今回は、ノンブロッキングについて備忘録として軽く説明載せます。
目次
🧷 ブロッキングとノンブロッキング
まずは「ブロッキング」と「ノンブロッキング」の違いを簡単におさらいです。
ブロッキング
一般的なプログラミング言語では、ブロッキング(同期)処理が基本です。
例えば、ファイルを読み込むとき、プログラムはその読み込みが完了するまで次の処理を進めません。
const fs = require('fs');
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);
console.log('次の処理');
✅ このコードは、readFileSyncがファイルを読み込んで完了するまで、プログラムが一時停止します。ファイルが読み込まれるまで、次のconsole.logは実行されません。
✅ これがブロッキング(同期)処理です。
ノンブロッキング
一方で、Node.jsはノンブロッキング(非同期)で動作します。
つまり、I/O操作を行っている間でも、他の処理がブロックされることなく進み続けるわけです☀️
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
console.log('ファイルを読み込んでいます...');
✅ このコードでは、readFileは非同期でファイルを読み込みます。
✅ readFileが完了するまで待つのではなく、すぐに次の行console.log('ファイルを読み込んでいます...')
が実行される。
✅ ファイルの読み込みが完了した時点でコールバック関数が呼ばれ、読み込んだ内容が表示される。
🧷 ノンブロッキングのメリット
ノンブロッキング処理の最大の利点は、高いパフォーマンスを実現できる点です。
特に、I/O操作が多いアプリケーション(例:ウェブサーバーやリアルタイムチャットアプリなど)で効果を発揮します。
例えば、従来の同期処理では、サーバーが一つのリクエストを処理している間は他のリクエストを待たせる必要があります。
ですが、ノンブロッキング処理を使うことで、サーバーはリクエストを処理している最中でも他のリクエストを並行して処理できます。
これにより、Node.jsは非常にスケーラブルで、同時に多数のリクエストを処理することが可能になります。
🧷 イベントループと非同期処理
Node.jsがノンブロッキングを実現できる理由は、イベントループという仕組みです。
- イベントループ:Node.jsが内部で非同期処理を行うための中心的なメカニズム
非同期のI/O操作はすべてイベントループに渡され、I/O操作が完了すると、Node.jsはコールバック関数を呼び出して処理を続けます。
イベントループのおかげで、Node.jsはI/O待ちの間に他の処理を並行して実行できるのです。
🧷 ノンブロッキングのリアルな例
const http = require('http');
const server = http.createServer((req, res) => {
if (req.url === '/') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, World!\n');
} else if (req.url === '/slow') {
setTimeout(() => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('This is a slow response\n');
}, 5000); // 5秒後にレスポンス
}
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
✅ このサーバーは、/slowのリクエストを5秒待たせますが、その間にも他のリクエストはすぐに処理されます。
✅ ノンブロッキングの力を活かして、長時間待つことなく、サーバーはどんどんリクエストを処理し続けます。
💫 まとめ
- Node.jsの「ノンブロッキング」とは、I/O操作を非同期で行うことで、プログラムが他の処理を待たずに並行して実行できる仕組み
- これにより、Node.jsは高いパフォーマンスとスケーラビリティを持ち、多数のリクエストを効率よく処理できる。
✅ ノンブロッキングの仕組みを活かすことで、特にリアルタイムアプリケーションや大規模なウェブサービスで圧倒的な力を発揮します。
Node.jsを使っているなら、この非同期処理の特徴をしっかり理解して活用するべし🚀