Node.jsイベントループ
Node.jsはシングルプロセスのシングルスレッドアプリケーションですが、V8エンジン(Googleが提供する非常に高いパフォーマンス)によって提供される非同期実行コールバックインターフェイスであるため、これらのインターフェイスは多数の同時実行を処理できます。
Node.jsのほぼすべてのAPIがコールバック関数をサポートしています。
Node.jsは基本的に、すべてのイベントメカニズムがデザインパターンのオブザーバーパターンを使用して実装されています。
Node.jsシングルスレッドは、while(true)イベントループに似ています。イベントオブザーバーが終了するまで、各非同期イベントがイベントオブザーバーを生成し、イベントが発生するとコールバックパラメーターが呼び出されます。
一般的に、各イベントを1つずつと考えます次々とスタートブラウザ、qq、WeChat、LOLなどのWindowsバックグラウンドプログラム(メモリスティックは非常に大きいため、同時に複数のプログラムを実行できます)。違いは、これらのプログラムが実行されると想定していることです。すぐに自動的に終了します、そして撤退の瞬間に、ポップアップ。次に想像してみてください:
//依次启动 : 1.浏览器, 2.qq, 3.微信, 4.LOL
//运行时长: 浏览器(15s), qq(5s), 微信(9s), LOL(1s)
//退出提示: 1. 退出 LOL, 2. 退出qq, 3. 退出微信, 4. 退出浏览器,
上記のプロセスは非同期実行プロセスですが、非同期実行は、より多くのバックグラウンドを開き、同時にプログラム(大容量メモリ)を実行することとして理解でき、合計15秒かかります。非同期でない場合は、ブロックされます。つまり、実行順に1つずつ実行されます。最後のプログラムは、次のプログラムが実行される前に実行されます。これは、コンピューターのバックグラウンドで同時に実行できるプログラムは1つだけです(メモリが壊れるほど小さい)コンピュータ)の場合、実行をブロックする期間は、15秒+ 5秒+ 9秒+ 1秒= 30秒になります。
次の図は参考資料です。
Node.jsコールバック関数
Node.jsでは、JavaScriptの言語機能により、非同期プログラミングの直接の現れはコールバックです。
ただし、コールバックを使用した後にプログラムが非同期になるとは言えません。タスクの完了後、コールバック関数がコールバックされます。ノードは多くのコールバック関数を使用します。NodeのすべてのAPIは、コールバック関数をサポートしています。
コールバックは何をしますか?ニーズは何ですか?または利点は何ですか?
コールバック関数を通じて、他のコマンドを実行しながらファイルを読み取ることができ、ファイルが読み取られた後、コールバック関数のパラメーターとしてファイルの内容を返します。このようにして、コードを実行したり、ファイルI / O操作を待機したりしても、ブロックは発生しません。これにより、Node.jsのパフォーマンスが大幅に向上します。多数の同時リクエストを処理できます。
ブロックコードと非ブロックコードの典型的な例:
テキストファイルを作成し、コールバックありとコールバックなしでそれを読み込もうとします。
ブロッキング:
js
var fs = require('fs');
var data = fs.readFileSync('hello.txt');
console.log(data.toString());
console.log('done');
バッシュ
我是中国人
“I'm from China, I love my country!”
done
非同期:
js
var fs = require('fs');
fs.readFile('hello.txt',function(err,data){
if(err) return console.log(err);
console.log(data.toString());
});
console.log('done');
バッシュ
done
我是中国人
“I'm from China, I love my country!”
簡単に言うと、ファイルの読み取りにはI / O操作が必要なため、比較的時間がかかります。非同期操作では、最初にファイルの読み取り操作を開きますが、実行するにはバックグラウンドで停止することを視覚的に理解できます。実行中は、「完了」の直接印刷にかかる時間がはるかに短いため、プログラム全体が最初になります「完了」を直接出力すると、プログラムは保留中のファイル読み取りの結果を出力します。
非同期実行をより直感的に説明するために、同じロジックコードを使用して、サイズの異なる2つのファイルを読み取ります。
var fs = require('fs');
//注意,下面两段代码,写在前面的文本文件占用空间更大。
fs.readFile('compareText2.txt',function(err,data){
if(err) return console.log(err);
console.log("-----这个文本更长一些-----");
console.log(data.toString());
console.log("-----这个文本更长一些-----");
console.log("done,\ncompareText2.txt");
});
fs.readFile('compareText1.txt',function(err,data){
if(err) return console.log(err);
console.log("#####这个文本更短一些#####");
console.log(data.toString());
console.log("#####这个文本更短一些#####");
console.log("done,\ncompareText1.txt");
});
バッシュ
#####这个文本更短一些#####
-----LINE5-----
"我是中国人"
"我是中国人"
"我是中国人"
"我是中国人"
"我是中国人"
-----LINE5-----
#####这个文本更短一些#####
done,
compareText1.txt
-----这个文本更长一些-----
-----LINE150-----
"我是中国人"
"我是中国人"
"我是中国人"
//.......
//......共150行
//......
"我是中国人"
-----LINE150-----
-----这个文本更长一些-----
done,
compareText2.txt
大きなファイルを読み込むためのロジックが前面に書かれているのを発見しましたが、後で出力されます。コードの実行プロセスは次のとおりです。最初に関数の実行をトリガーして大きなファイルを読み取り、次に一時停止してから、関数の実行をトリガーして小さなファイルを読み取ります。小さなファイルの内容は少ないため、小さなファイルの実行は速くなります。戻り値はより速く戻るので、小さいファイルの読み取りの戻り結果はより速く出力されます。