コードですWindows 7のr102546ランニングここ
それがハングアップする前にこのループは約60K 80K回実行することができます。それ以降は何も起こりません。
私の同僚のコンピュータでは、おそらく40kから60k回です。しかし、このループは永遠に続くべきではないでしょうか?
私は、最初の接続の設定の平均実行時間をテストするベンチマークを実行していたので、私はちょうど終了し、すべての後に時間を終了し、最初の開始時刻を取得することはできません。
これは私が使用しているOSに関連していますか?
問題を知っているユーザーがいらっしゃいます。
============================================== ============
更新2016年4月13日:
ある日、私はこの質問を提起した直後、私はそれがだった愚かなものを疑問実現。そして、私が本当にやりたいことではありませんでした。だから私はそれをさらに説明します。ここで
は、テスト構造である:
私はconnections.Clientは、「接続 '」イベントでの「セットアップ」イベントを送信します扱うノードのサーバーを持っています。サーバー側でRedis購読チャネルが作成され、dbからいくつかの照会が行われ、クライアントの 'setup'イベントのコールバックが呼び出されます。 'setup'コールバックのクライアント切断ソケット。 'disconnect'イベントで再接続します。
クライアントコードは、高い同時実行をシミュレートするために、バックエンドおよびクラスタで実行するようにsocket.ioクライアントを使用します。
コードこれらのようなものです: 最初の接続時(機能の一部がここに記載されていない)
[server]
socket.on('setup', function(data, callback) {
queryFromDB();
subscribeToRedis();
callback();
}
[client]
var requests = 1000;
if (cluster.isMaster) {
for (var i = 0; i < 100; ++i) {
cluster.fork();
}
} else {
var count = 0;
var startTime = process.hrtime();
socket = io.connect(...);
socket.on('connect', function() {
socket.emit('setup', {arg1:'...', arg2:'...'}, function() {
var setupEndTime = process.hrtime();
calculateSetupTime(startTime, setupEndTime);
socket.disconnect();
}
}
socket.on('disconnect', function() {
if (count++ < requests) {
var disconnectEndTime = process.hrtime();
calculateSetupTime(startTime, disconnectEndTime);
socket.connect();
} else {
process.exit();
}
}
}
はわずか500または600回を作ることができます。何とか私はすべてのhrtime()コードを削除し、1000回にしました。しかし、後で私は2000時間(hrtime()コードなし)のような要求の数を上げました、それは再び終了できませんでした。
私は完全に混乱しました。昨日、私はそれがhrtimeに関係していると思っていましたが、もちろんそうではありませんでした。私はhrtimeによって誤解されました。
しかし、今何が問題になっていますか?
============================================== ===================== 更新2016年4月19日
私はこの問題を解決しました。
私のクライアントコードでは、新しいユーザーをシミュレートするためにsocket.disconnectとsocket.connectを使用しています。これは間違っています。
この場合、サーバーは切断された古いソケットを認識しないことがあります。ソケットオブジェクトを削除し、別のソケットオブジェクトを削除する必要があります。
接続数が切断回数に等しくないことがわかります。これによりコードが再接続できなくなるため、応答がないためループ全体がハングします。
Windows 4.2のノード4.2.4で試してみましたが、それを止める前に100万回以上の実行がありました。 –