nodejs中の渋滞と渋滞ではない(https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/)
2080 ワード
一、簡単に述べる
この文章は主にNodejsの中の渋滞と渋滞ではなく、イベントサイクルとlibuvに関連しています.しかし、これらの知識を事前に知る必要はありません.jsとNodejsのフィードバックモードの基礎だけが必要です.
「I/O」とは、システムハードディスクとの相互作用およびlibuvによってサポートされるネットワーク相互作用を意味する.
1.ブロックブロックブロック
1.1コードの対比
ブロックとは、Nodejs中のjsプロセスが、js以外の操作が完了するまで待つ必要があります.なぜなら、ブロック操作が発生した時に、イベントサイクルが継続できないからです.
nodejsでは、cpuメモリが足りないため、jsの運転性能が悪い場合は、ブロックとは言わないが、jsだけがJs以外の操作(例えば、I/O)が完了するまで待機している場合をブロックといいます.Nodejs標準ライブラリにおける同期方法は、一般的なブロック動作である.原生モジュールにも閉塞方法があります.
Nodejs標準ライブラリにおけるIO方法のすべては、非同期非ブロッキングバージョンを提供し、これらの方法はコールバック関数を受信する.いくつかの方法には対応するブロックバージョンがあります.Syncを先頭に名前を付けます.
ブロッキング方法は同期して実行され、ブロッキング方法ではなく非同期的に実行される.ファイルシステムモジュールを例にとって、以下は同期ファイルの読み込み方法です.
2.同時性とスループット(Concerency and Throughput)
Nodejsでjsを実行するのはシングルスレッドですので、同時性とはイベントコールバック関数を実行する能力です.同時性の強いコードは、js以外の操作が発生した場合でも、イベントのコールバックを継続することができます.例えば、サーバに到達する各要求は50 msで完了し、45 msはデータベースの非同期の読み取りに使用される.ブロック以外の非同期方法を選択すると、サーバ45 msの時間を解放して他の要求を処理することができる.これは非閉塞法を選ぶ最も明白な利点である.jsにおけるイベントサイクルモデルは他の言語とは異なるところにおいて、他の言語はマルチスレッドを使用して同時性動作を処理することができる.
3.混合閉塞方法と非閉塞方法の危険性
IOを扱う時に避けたいパターンがあります.
この文章は主にNodejsの中の渋滞と渋滞ではなく、イベントサイクルとlibuvに関連しています.しかし、これらの知識を事前に知る必要はありません.jsとNodejsのフィードバックモードの基礎だけが必要です.
「I/O」とは、システムハードディスクとの相互作用およびlibuvによってサポートされるネットワーク相互作用を意味する.
1.ブロックブロックブロック
1.1コードの対比
ブロックとは、Nodejs中のjsプロセスが、js以外の操作が完了するまで待つ必要があります.なぜなら、ブロック操作が発生した時に、イベントサイクルが継続できないからです.
nodejsでは、cpuメモリが足りないため、jsの運転性能が悪い場合は、ブロックとは言わないが、jsだけがJs以外の操作(例えば、I/O)が完了するまで待機している場合をブロックといいます.Nodejs標準ライブラリにおける同期方法は、一般的なブロック動作である.原生モジュールにも閉塞方法があります.
Nodejs標準ライブラリにおけるIO方法のすべては、非同期非ブロッキングバージョンを提供し、これらの方法はコールバック関数を受信する.いくつかの方法には対応するブロックバージョンがあります.Syncを先頭に名前を付けます.
ブロッキング方法は同期して実行され、ブロッキング方法ではなく非同期的に実行される.ファイルシステムモジュールを例にとって、以下は同期ファイルの読み込み方法です.
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
以下はこれに対応する非同期の書き方である.const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
});
ブロッキング方法は相対的に非ブロッキング方法では簡単ですが、ファイルの読み込みが完了してから後の動作が実行されるという欠点があります.ブロック方法では、エラーはキャプチャされなければなりません.そうでなければ、プログラムは崩壊します.しかし、非ブロッキングバージョンでは、エラーの捕獲は行わないことができる.2.同時性とスループット(Concerency and Throughput)
Nodejsでjsを実行するのはシングルスレッドですので、同時性とはイベントコールバック関数を実行する能力です.同時性の強いコードは、js以外の操作が発生した場合でも、イベントのコールバックを継続することができます.例えば、サーバに到達する各要求は50 msで完了し、45 msはデータベースの非同期の読み取りに使用される.ブロック以外の非同期方法を選択すると、サーバ45 msの時間を解放して他の要求を処理することができる.これは非閉塞法を選ぶ最も明白な利点である.jsにおけるイベントサイクルモデルは他の言語とは異なるところにおいて、他の言語はマルチスレッドを使用して同時性動作を処理することができる.
3.混合閉塞方法と非閉塞方法の危険性
IOを扱う時に避けたいパターンがあります.
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.unlinkSync('/file.md');
上記のコードの中で、fs.unlinkSync()はfs.readFileメソッドの前に実行されます.このようにすると、ファイルは読み取りが完了する前に削除されます.最善の方法は以下の通りです.const fs = require('fs');
fs.readFile('/file.md', (readFileErr, data) => {
if (readFileErr) throw readFileErr;
console.log(data);
fs.unlink('/file.md', (unlinkErr) => {
if (unlinkErr) throw unlinkErr;
});
});