2

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 はブロックの問題を何らかの方法で解決しますか? それともまだ心配する必要がありますか?

PS: この質問は大幅な書き直しです。以下の SO ユーザーにはご容赦をお願いします。私は間違いなくここで何かを学びました。

4

3 に答える 3

2

問題は、express がこれを自動的に処理するのか、それともまだ心配する必要があるのか​​ということです。

あなたはまだそれについて心配する必要があります。NodeJS はシングルスレッドです。つまり、どこで呼び出されても、すべての同期操作は完全にブロックされます。Express も他のフレームワークも、サーバーをブロックせずに同期操作を使用することはできません。単純

var x = 1;

新しい変数の作成とそれに新しい値の割り当てが完了するまで、サーバー全体を既にブロックしています。

非同期アーキテクチャの要点は、スレッドよりも効率的であるということです。だまされないでください。分離がないため、非同期プログラミングはスレッドよりも困難です。1 つのスレッドが失敗しても他のスレッドは機能しますが、非同期サーバーでは 1 つの例外でサーバー全体が壊れる可能性があります。

問題は、メイン ノードのイベント ループをブロックできることです。

この文は、NodeJS がメインのイベント ループ以上のものを持っていることを示唆しています。それは真実ではない。すべてのコードはメイン ループ内で呼び出されます。

これも見てください:

イベント ループとマルチスレッド ブロッキング IO

于 2013-04-08T13:19:30.323 に答える
1

非非同期関数への呼び出しは、別の関数にラップされていても、「ブロック」されます唯一の例外は、ラッパー関数が処理を別のスレッド/プロセス ( clusterAPI など) に任せることができる場合です。

于 2013-04-08T11:19:48.600 に答える