5

私は、クライアントがWebSocketを介してサーバーと通信できる必要があるプロジェクトに取り組んでいます。ユーザー入力に対する応答性が高いように開発したアプリケーション以降、低速接続でGUIが中断されないように、WebWorkerにネットワーク経由のすべての通信を行わせることにしました。これまでのところ問題なく動作します。

ここで、ネットワークが遅く、送信するメッセージの量が多い場合に必要となる最適化について考えました。これらのメッセージのほとんどは、他のクライアントのユーザーインターフェイスを同期するためだけのものであるため、必要に応じてそれらの一部を削除できます。しかし、そうするためには、混雑している状況を検出する可能性が必要です。

キューのアイデアを思いつきました。送信される各メッセージはキューにプッシュされ、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を作成します。次に、関数processMessageQueue()を実行します。これは、WebSocketを介してデータを送信することにより、キューを永続的に空にするループです。さて、私の問題は、メッセージをキューにプッシュする可能性がないように見えることです。これは、タイプ'SEND'のメッセージが到着したときに発生するはずですが、ワーカーがビジー状態でイベントを処理できない場合は発生しません。したがって、キューをループするか、メッセージをプッシュすることができますが、両方を行うことはできません。

私が必要としているのは、どういうわけかこのキューにデータをプッシュする方法です。それが簡単に不可能な場合は、メッセージが送信されるよりも早く到着するタイミングを見つける別の方法を誰かが考えられるかどうかを知りたいと思います。ヒントはありますか?

前もって感謝します!

4

1 に答える 1

2

onmessageイベントを処理する時間をワーカーに与える必要があります。これを行うwhile(true)と、すべての処理時間がかかり、イベントを実行できなくなります。

たとえば、次のように変更できます

function processMessageQueue() {
    if(queue.length > 0) ws.send(queue.shift());
    setTimeout(processMessageQueue, 50);
}
于 2012-01-08T04:08:12.903 に答える