Node.jsイベントループ


Node.js イベント ループ

Node.js は単一プロセスのシングルスレッド アプリケーションですが、イベントとコールバックによる同時実行をサポートしているため、パフォーマンスは非常に高くなります。

Node.js のすべての API は非同期であり、別個のスレッドとして実行され、非同期関数呼び出しを使用し、同時実行を処理します。

Node.js 基本的にすべてのイベントメカニズムは、デザインパターンのオブザーバーパターンを使用して実装されます。

Node.js の単一スレッドは、イベント オブザーバーが終了するまで while(true) イベント ループに入るのと似ています。イベントが発生すると、


Event ドライバーが呼び出されます。

Node.js はイベント駆動型モデルを使用します。Web サーバーはリクエストを受信すると、リクエストを閉じて処理し、次の Web リクエストを処理します。

このリクエストは完了すると処理キューに戻され、キューの先頭に到達すると結果がユーザーに返されます。

ウェブサーバーは読み取りまたは書き込み操作を待たずに常にリクエストを受け入れるため、このモデルは非常に効率的でスケーラブルです。 (これは、ノンブロッキング IO またはイベント ドリブン IO とも呼ばれます)

イベント ドリブン モデルでは、イベントをリッスンするためにメイン ループが生成され、イベントが検出されるとコールバック関数がトリガーされます。


イベント駆動型プロセス全体はこのように非常に簡単に実装されます。オブザーバー パターンとある程度似ており、イベントはサブジェクト (Subject) に相当し、このイベントに登録されたすべてのハンドラー関数はオブザーバー (Observer) に相当します。

Node.js には複数の組み込みイベントがあります。次の例に示すように、イベント モジュールを導入し、EventEmitter クラスをインスタンス化することで、イベントをバインドしてリッスンできます。

// 引入 events 模块var events = require('events');// 创建 eventEmitter 对象var eventEmitter = new events.EventEmitter();

次のプログラムはイベント ハンドラーをバインドします。 us イベントはプログラムでトリガーできます:

// 绑定事件及事件的处理程序eventEmitter.on('eventName', eventHandler);

Instance

次のコードを含む main.js ファイルを作成します:

// 触发事件eventEmitter.emit('eventName');

次に、上記のコードを実行してみましょう:

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});

// 触发 connection 事件 
eventEmitter.emit('connection');

console.log("程序执行完毕。");

Node アプリケーションはどのように動作しますか?


Node アプリケーションでは、非同期操作を実行する関数は最後のパラメーターとしてコールバック関数を受け取ります。 コールバック関数は、最初のパラメータとしてエラー オブジェクトを受け取ります。

次に、前の例をもう一度見て、次のファイル内容で input.txt を作成しましょう:

$ node main.js
连接成功。
数据接收成功。
程序执行完毕。

次のコードで main.js ファイルを作成します:

菜鸟教程官网地址:www.runoob.com

上記のプログラムでは、 fs.readFile( ) は、ファイルの読み取りに使用される非同期関数です。 ファイルの読み取り中にエラーが発生した場合、error err オブジェクトはエラー情報を出力します。

エラーが発生しない場合、readFile は err オブジェクトの出力をスキップし、ファイルの内容はコールバック関数を通じて出力されます。

上記のコードを実行すると、実行結果は以下のようになります。

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err){
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("程序执行完毕");

次に、input.txtファイルを削除します。実行結果は以下のようになります。

程序执行完毕
php中文网官网地址:www.php.cn

ファイルinput.txtが存在しないため、エラーメッセージが表示されます出力。