2012-01-08 4 views
5

私は、クライアントがWebSocket経由でサーバーと通信できなければならないプロジェクトに取り組んでいます。ユーザーの入力に対して高い応答性を持つアプリケーションを開発して以来、WebWorkerにネットワーク経由ですべての通信をさせ、低速の接続でGUIを中断させないことにしました。これまでのところうまくいきます。JavaScript:ネットワーク通信用のキューを使用する

ネットワークの速度が遅く、送信するメッセージの量が多い場合に必要となる最適化について考えました。これらのメッセージのほとんどは、他のクライアントのユーザーインターフェイスを同期させるだけなので、必要に応じていくつかのメッセージをドロップすることができます。しかし、そうするには、輻輳が発生している状況を検出する必要があります。

私たちはキューの考え方を思いつきました。送信される各メッセージはキューにプッシュされ、WebWorkerはキューを永続的に反復してそこで見つかったすべてのメッセージを送信する以外に何もしません。これにより、キューに一定数の要素がある(つまり、メッセージの送信が遅すぎる)場合、後でワーカーに異なる動作をさせることができます。アイデアは簡単で簡単ですが、実装はそうではないようです。

var ws; 
var queue = new Array(); 

function processMessageQueue() { 
    while(true) 
     if(queue.length > 0) ws.send(queue.shift()); 
} 

self.addEventListener('message', function(e) { 
    var msg = e.data; 
    switch(msg.type) { 
     case 'SEND': 
      queue.push(JSON.stringify(msg)); 
      break; 
     case 'CREATE_WS': 
      ws = new WebSocket(msg.wsurl); 
      ws.onmessage = function(e) { 
       self.postMessage(JSON.parse(e.data)); 
      } 
      processMessageQueue(); 
    } 
}, false); 

ご覧のとおり、ワーカーはメッセージを受信するとすぐにWebSocketを作成します。次に、WebSocket経由でデータを送信してキューを永久に空にするループであるprocessMessageQueue()を実行します。今、私の問題は、キューにメッセージをプッシュする可能性がないようです。それは、タイプ 'SEND'のメッセージが到着したときに起こるはずですが、ワーカーがあまりにも多忙であらゆるイベントを処理することはできません。したがって、キュー上をループするか、メッセージをプッシュすることができますが、両方をプッシュすることはできません。

私が必要とするのは、何とかこのキューのデータをプッシュする方法です。それが容易ではない場合は、誰かがメッセージがより早く到着したときに、メッセージが送信されたときに他の方法を見つけることができるかどうかを知りたいと思っています。何かヒント?

ありがとうございます!

答えて

2

onmessageイベントを処理する時間を労働者に与える必要があります。 while(true)を実行するとすべての処理時間がかかり、イベントは実行できません。

あなたは、例えば、あまりにも簡単だった

function processMessageQueue() { 
    if(queue.length > 0) ws.send(queue.shift()); 
    setTimeout(processMessageQueue, 50); 
} 
+0

awwは、それを変更することができます。魅力のように動作します、ありがとう! – j0ker

関連する問題