ホームページ > ウェブフロントエンド > jsチュートリアル > Node.js イベントloop_node.js の詳細な分析

Node.js イベントloop_node.js の詳細な分析

WBOY
リリース: 2016-05-16 15:24:16
オリジナル
1483 人が閲覧しました

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

(出典: Javascript はシングルスレッドで非同期ですが、これらの言語にはイベント駆動型であるという共通の特徴があります。言語を駆動するイベントは異種プラットフォームから来ます。)

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

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

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

イベント駆動型モデル

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


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


Web サーバーは読み取りまたは書き込み操作を待たずに常にリクエストを受け入れるため、このモデルは非常に効率的でスケーラブルです。

(これはノンブロッキング IO またはイベント駆動型 IO とも呼ばれます)

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

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


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


//引入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("程序执行完毕。"); 
ログイン後にコピー
上記のコードの出力結果は次のとおりです:


接続に成功しました。


データは正常に受信されました。


プログラムの実行が完了しました。

上記の結果は、ご想像のとおり、このイベント駆動モデルを通じて非同期操作を実現できます。


(たとえば、他のコマンドの実行中にファイルを読み取ることができます。ファイルの読み取りが完了すると、ファイルの内容がコールバック関数のパラメーターとして返されます。この方法では、ファイル I/O のブロックや待機は発生しません。これにより、Node.js のパフォーマンスが大幅に向上し、多数の同時リクエストを処理できるようになります)


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 の内容。

上記のコードから、fs.readFile がイベントを配布できることがわかります。もちろん、Node.js の多くのオブジェクトは、新しい接続があるたびにイベントを配布します。これらの生成される Event オブジェクトはすべて events.EventEmitter のインスタンスです。


しかし、ほとんどの場合、EventEmitter を直接使用するのではなく、オブジェクト内で継承します。イベント応答をサポートするコア モジュールが EventEmitter のサブクラスである限り、fs、net、http が含まれます。


なぜこんなことをするのですか?理由は 2 つあります:

まず、あるエンティティ関数を持つオブジェクトのイベント実装は、イベントの監視と発行がオブジェクトのメソッドである必要があります。

次に、JavaScript のオブジェクト メカニズムはプロトタイプに基づいており、EventEmitter を継承しても、オブジェクトの元の継承関係が損なわれることはありません。


私の最初の NodeJs プロジェクトを共有させてください

Node.js をインストールするには、通常、ソース コードをコンパイルする方法と、コンパイルされたファイルを使用する方法の 2 つがあります。

現在、ホームディレクトリにダウンロードしたばかりのnode-v4.2.3-linux-x64があります


1. まず、

を解凍します。

コードをコピーします コードは次のとおりです:
tar xvf ノード-v4.2.3-linux-x64


2. リンクを設定する目的は、任意のパス

でノードコマンドを使用できるようにすることです。

コードをコピーします コードは次のとおりです:
ln -s /home/node-v4.2.3-linux-x64/bin/node /usr/local/bin/node
ln -s /home/node-v4.2.3-linux-x64/bin/npm /usr/local/bin/npm


3. ホームフォルダーの下に mynodeproj という名前のディレクトリを作成し、server.js という名前のファイルを作成します (もちろん、別の名前を付けることもできます)

4. ノードコマンドを使用して上記のコードを実行します

ノードサーバー.js

上記のコマンドを実行すると、コマンド ラインに「Server runnint at http://127.0.0.1:8888/」と表示されます。これは、プログラムが正常に実行されたことを意味します。

私のサーバーは Alibaba Cloud で実行されているため、外部ブラウザに Alibaba Cloud IP + ポートを入力するだけでアクセスできます。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート