Node Beginner Bookとその後の電子ブックの購入から node.js を学んでいます。この本の中で、Manuel Kiessling は次のようなブロッキング コードの行について説明しています。
fs.readFileSync(blah);
ノード プロセス全体と入ってくるすべてのリクエストをブロックします。
これは、Kiessling が使用する例です。
exec("ls -lah", function( error, stdout, stderr ) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
});
これは私をだましたコードです。彼は、データベースの検索ls -lah
など、より時間のかかる操作に簡単に置き換えることができると述べています。find / -name "*"
私は、非同期コールバックのために、高価でブロッキング操作がバックグラウンドで明示的に実行されると想定しました。
だから私はこのコードで私の理論をテストする必要がありました:
var http = require("http");
var url = require("url");
badSleep = function(ms) {
var now = new Date();
var finishAtDate = now.getTime() + ms;
console.log("CPU burning sleep for " + ms + " milliseconds");
while(new Date() < finishAtDate) {
// do nothing
}
};
asyncWrapper = function(callback) {
//badSleep(3000);
callback();
}
http.createServer(function(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Serve up " + pathname);
if (pathname == '/favicon.ico') {
response.writeHead(404);
response.end();
} else {
asyncWrapper(function() {
badSleep(3000);
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("\nI was wrong " + new Date());
response.end();
});
}
}).listen(8888);
問題は、スリープをどこに置いても、ノード イベント ループがブロックされることです。コールバックはブロッキングの問題を解決しません。SO の優れたユーザーは、コメントでもこれを教えてくれました。
では、どうexec
やって???困惑したので、github で子プロセスのコードを見に行きました。私はそれexec
が呼び出すことを発見しましたspawn
!!! 子プロセスになります!謎が解けました。非同期コードはブロッキングの問題を「解決」しませんが、スポーンは解決します。
それが私の質問につながります。Express はブロックの問題を何らかの方法で解決しますか? それともまだ心配する必要がありますか?