ホームページ >ウェブフロントエンド >jsチュートリアル >NodeJs_javascript スキルのノンブロッキング メソッドの紹介

NodeJs_javascript スキルのノンブロッキング メソッドの紹介

WBOY
WBOYオリジナル
2016-05-16 17:52:421075ブラウズ

まず、NodeJs を使用して基本的なサーバーを構築します。
index.js

コードをコピー コードは次のとおりです。

var requestHandler = require(" ./requestHandler");
var サーバー = require("./server");
var ルート = {
"/hello": requestHandler.hello,
"/upload" : requestHandler.upload
};
server.start(route)

server.js

server.js


var http = require("http");
var url = require("url"); start = function(route) {
var server = http.createServer(function(req, res) {
var pathName = url.parse(req.url).pathname;
var handler = Route[pathName ];
if (ハンドラー) {
console.log("スルーパス:" pathName ":" new Date().getTime());
handler(res);
res.writeHead(404, {"Content-Type": "text/plain"});
res.end()
}
}); 8088);
};


requestHandler.js



コードをコピーします
コードは次のとおりです exports .hello = function(res) { res.writeHead(200, {"Content-Type": "text/plain"}); ("こんにちは。"); res .end();
exports.upload = function(res) {
res.writeHead(200, {"コンテンツ タイプ": "text/plain"});
res .write("upload");


cmd にノード インデックスを入力します。 jsを起動します。
ただし、上記のコードはブロックしています。 createServerのコールバック関数に長期計算がある場合。その後、node.js のイベント ポーリングがブロックされます。
NodeJS では、効率の鍵はイベント ループに素早く戻ることにあります。
この例では、イベントループがスリープ関数によってブロックされているため、createServer のコールバックが間に合わなくなります。



コードをコピーします


コードは次のとおりです。

function sleep(milliSecond) { var startTime = new Date().getTime(); console.log(startTime); while(new Date().getTime() <= milliSecond startTime) { } コンソール.log( new Date().getTime()); }
exports.hello = function(res) {
sleep(20000)
res.writeHead(200, {"コンテンツ- Type": "text/plain"});
res.write("say hello.");
res.end();
};
exports.upload = function(res) {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("upload");
res.end(); ;


次に、最初に http://localhost:8088/hello と入力し、次に http://localhost:8088/upload を入力します。アップロードにはそれほど時間はかかりませんが、hello が完了するまで待つ必要があることがわかります。
私たちは非同期で呼び出す方法を見つけようとしています。たとえば、formidable でのアップロードはノンブロッキングであることがテストされています。 formidable のソース コードを見ると、最も重要なのは次のコードであることがわかりました。




コードをコピー

コードは次のとおりです。以下のように:

IncomingForm.prototype.parse = function(req, cb) {
this.pause = function() {
try {
req.pause();
} catch (err) {
// ストリームは破棄されました
if (!this.ended) {
// 完了する前にクラッシュして書き込みます
this._error(err );
}
false を返します。
}
true を返します。
};
this.resume = function() {
try {
req.resume();
} catch (err) {
// ストリームは破棄されました
if (!this.ended) {
// 完了する前にクラッシュして書き込みます
this._error(err );
}
false を返します。
}
true を返します。
};
this.writeHeaders(req.headers);
var self = this;
req
.on('error', function(err) {
self._error(err);
})
.on('aborted', function() {
self.emit('aborted');
})
.on('data', function(buffer) {
self.write(buffer);
})
.on ('end', function() {
if (self.error) {
return;
}
var err = self._parser.end();
if (err) {
self._error(err);
}
});
if (cb) {
var フィールド = {}、ファイル = {};
this
.on('field', function(name, value) {
fields[name] = value;
})
.on('file', function(name, file) {
files[name] = ファイル;
})
.on('error', function(err) {
cb(err, フィールド, ファイル);
})
.on('end', function() {
cb(null, フィールド, ファイル);
});
}
これを返します;
};

解析中にヘッド情報が解析されますが、このセクションはブロックされます。ただし、真の真上のファイルの送信は req.on(data) 内で行われ、イベント駆動が利用されているためブロックされません。
はスリープのように大量の計算を消費しますが、nodeJS メッシュ フレームワークに依存することはできませんか?
は、html5 WebWorker に似ています。
は requestHandler.js を次のように改造します:
代制 代次:

var childProcess = require("child_process");
exports.hello = function(res) {
var n = childProcess.fork(__dirname "/subProcess.js");
n.on('message', function() {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("こんにちは。 ");
res.end();
});
n.send({});
};
exports.upload = function(res) {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("アップロード");
res.end();
};

subProcess.js を追加します
复制代代码如下:

function sleep(milliSecond) {
var startTime = new Date().getTime();
console.log(startTime);
while(new Date().getTime() }
console.log(new Date().getTime());
}
process.on('message', function() {
sleep(20000);
process.send({});
});

テスト、こんにちはなど待機中に、アップロードが返されました。しかし、これはどの程度のレベルであっても、この概念はサポートされていません。
他の NodeJS は 2 層のアーキテクチャです。重要: ノードは、実際には v8 の js コマンドを使用しており、js 関数を実行するためにイベント シーケンスが設定されています。そのため、他の関数は内部で他の関数に対してブロックを生成します。 nextTick や setTimeout などは、妨げられないように新しいプロセスを生成することはできません。これは、イベント シーケンスの要素の順序の問題ではなく、直接実行されます。 setTimeout は c ラインプロセスを追加し、指定された時間にコールバックをノードのファイル io にイベントシーケンス
を追加します。その他の readFile などの関数、2 番目のパラメータしたがって、ノード内の最初のコンポーネントはダウンコールバックであり、その後、底層 c を使用して c で開始されるプロセスを調整し、js ではなく 了 c に到達したため、実行されていると見なすことができます。 mysql のような多くのメソッドが、ソース コードを認識していないことを知らずに、つまりソケット送信コマンドであり、このプロセスの速度は非常に速いです。
では、この節の文章は、もし残りの端末にかなりの時間がかかる場合の計算を意味します。 、js を使用して c を起動するプロセスですが、この subprocess.js はノードのイベント シーケンスの内部に影響を与えないため、他の js 機能を妨げません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。