1

node.js またはブラウザーのいずれかで、本当に奇妙なことを発見したと思います。したがって、node.js はノンブロッキングである必要がありますが、単純な setTimeout は同じクライアントの Web サイト全体をブロックします。

これはサーバーコードです:

// Create HTTP Server
var http = require('http');

// Create page number holder
var page = 0;

http.createServer(function (req, res) {
    // Increment Page Number
    page++; 

    // Log page load
    console.log('LOAD PAGE', page); 

    // Set response header
    res.writeHead(200, {'Content-Type': 'text/plain'}); 

    // Wait 10 seconds and write Hello World message to client.
    setTimeout(function(){ res.end('Hello World\n'); }, 10000); 

}).listen(5000); // Listen on port 5000

// Log server start
console.log('Server running on port 5000.');

つまり、私が話しているのは、Chrome(バージョン 25.0.1364.152) でhttp://mysite.com:5000/を 2 つのタブで開こうとすると、2 番目のタブがノードによって処理される前に、最初のタブが終了する必要があるということです。 .js。

次のようになります。

Client: Open Tab1 
> server console: LOAD PAGE 1

Client: Open Tab2
> server console: Nothing happens

Server: Wait 10 seconds
> server console: LOAD PAGE 2

node.js が両方のリクエストをすぐに実行することを期待します。それ以外の場合、これはノンブロッキングではありません。私はすでに Firefox 19 でこれをテストしたので、ブラウザはこれに関して同じように動作するようです。

それで、何が起こっているのですか?私は何かが欠けていますか?? :OOOO

アップデート

テストを Safari(6.0.2) で実行しただけで正常に動作するため、これは Chrome や Firefox などのブラウザーの問題である可能性があります。

Node.js バージョンv0.6.17およびv0.8.21でテスト済み

4

2 に答える 2

12

ブラウザは、ドメイン名ごとの同時接続制限を実装しています。をちょきちょきと切る:

通常、ブラウザーはサーバーごとの同時 HTTP 接続数を 2 に制限します (ここでは、わかりやすくするために「サーバーごと」という用語を広く使用しています。たとえば、複数の物理マシンが同じパブリック IP を共有している可能性があります)。ブラウザ セッションには既に 2 つの HTTP 接続があり、それ以降の接続要求は、これら 2 つの HTTP 接続のいずれかが終了するまで待機する必要があります。その結果、ブラウザ (またはアプリケーション) がロックされているように見えます。何年も前には理にかなっていましたが、今日の Ajax 対応の「web 2.0」アプリケーションでは非常に問題があります。

ソース: http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue

ノードはブロックしていません。ブラウザはブロックしています。テストには apache ベンチマーク (ab -c 10 -n 10) をお勧めします。

于 2013-03-05T17:14:03.210 に答える
4

はい、何かが足りません。本格的なWebブラウザ以外の何かでサーバーをテストしてみてください。curlたとえば試してみてください。

Chromeは、指示されたことを実行する以外にも多くのことを実行します。

于 2013-03-05T17:06:31.817 に答える