0

この素晴らしいチュートリアルに従ってきました。Javascriptと関数型プログラミングに慣れていないので、ノンブロッキングが本質的に何を意味するのかを理解したかったのです。ブロッキング動作を実現するために、JSコードに意図的に10秒の「スリープ」を追加しました。

    function route(pathname, handle)
{
    console.log("About to route a request for :"+pathname);

    if(typeof handle[pathname]==='function')
    {
        handle[pathname]();
    }
    else
    {
        console.log("No request handler for "+pathname);
    }


    sleep(10000);
    console.log("Exiting router");
}

function sleep(milliSeconds)
{
    var startTime = new Date().getTime(); // get the current time
    while (new Date().getTime() < startTime + milliSeconds); // hog cpu
}

exports.route=route;

このコードは、ブラウザから呼び出している別の「サーバー」スクリプトからのコールバックとして使用されています。サーバースクリプトに対して100のリクエストを同時に実行すると、10秒後に100の応答が並行して返されると予想していました。ただし、このコードはリクエストを1つずつ実行します。これは確かにnode.jsの背後にある哲学に失敗しますよね?? これは、Javaサーブレットでこのような悪いコードを実行し、Tomcatで実行した場合でも発生しません。

このシナリオでのもう1つの観察結果は、リクエストが時系列で処理されなかったことです。つまり、リクエストはランダムに実行されます。これは私にはよく聞こえません!!

私のコードにはいくつかの問題があると思います-私の2つのクエリ(もう1つは年代学に関するもの)への回答とともに、ここでの概念を理解するのを手伝ってください。

ありがとう !

4

1 に答える 1

4

サーバースクリプトに対して100のリクエストを同時に実行すると、10秒後に100の応答が並行して返されると予想していました。ただし、このコードはリクエストを1つずつ実行します。

はい。ノードは厳密にシングルスレッドであるため、各リクエストはシリアルで実行されます。JavaScriptコードには並列処理はありません(ただし、コンピューターの基盤となるI / Oサブシステムは並列処理を行っている可能性があります)。

これは確かにnode.jsの背後にある哲学に失敗しますよね??

いいえ。node.jsの哲学は、I / Oイベントのアクションの準備ができたら、イベントハンドラーをできるだけ早く実行することです。

「スリープ」関数は実際にはスリープしないことに注意してください。代わりに、CPUをペグします。ノードはシングルスレッドであるため、他のすべてのアクションはCPUクランチコードでブロックされます。コードが実際にCPUを集中的に使用するアクションを実行している場合も同じです。 。ただし、コードが代わりにI / O操作を実行していた(そして適切に設計されていた)場合、ノードはI/Oブロッキングコードに関する他のアクションをスケジュールします。このように考えてください-node.jsは、CPU使用率をブロックするのではなく、I/Oでコードをブロックするのを防ぎます。コードがCPUを集中的に使用し、他のハンドラーをブロックすることが心配な場合は、他のハンドラーを実行できるようにイベントループに譲る方法でコードを設計する必要があります。

このシナリオでのもう1つの観察結果は、リクエストが時系列で処理されなかったことです。つまり、リクエストはランダムに実行されます。

はい、これは可能です。node.jsは基本的に、対象のI/Oイベントに「イベントハンドラー」をアタッチするための単なる方法であることを覚えておく必要があります。これらのI/Oイベントは、基盤となるオペレーティングシステムのアクション(ソケット接続が確立されている、ファイルの読み取りが完了しているなど)によってトリガーされ、node.jsはそれに応じてハンドラーを呼び出します。

オペレーティングシステムは、実際に発生するタイミングと「ユーザースペース」プロセスで使用可能であると判断するタイミングについて独自の「内部簿記」を行うため、発生を予期するタイミングとコンピューターが実際に発生すると言うタイミングに違いがある場合があります。 。さらに、イベントをスケジュールするときにノード(またはおそらくOS)が「公平性」を保証するとは思いません。

于 2012-05-01T16:58:14.777 に答える