2016-04-28 6 views
2

[編集:この問題は、より狭い範囲を必要とする可能性がありますので、私は現在、これに気付くとChrome 49.0.2623.112 m(64ビット)をデフォルト設定で使用しています。私は現在HTTPSを使用していますが、スイッチの前に監視しています。]ウェブワーカーは、所有者がフォーカスしていないときに何をしますか?

WebワーカーにAJAXポーリングを渡すアプリケーションがあります。これはパフォーマンス面では驚異的な節約ではありませんが、アプリケーションをより簡単に推論し、将来のパフォーマンス上のメリットをもたらす可能性があります。

私は、XHR要求が行われるたびに私に通知するように、コンソールロギングラインをワーカーに追加します。ご存知のように、ロギングラインの重複がChromeに入ると、Inspectorは重複の数を記録します。

私がページを表示するように、私はコンソールで見ることができます:(52) XHR invoked

私が焦点にページを持っている場合、私はその整数が私のポーリング間隔ごとに、2秒ごとに増加ご覧ください。

は、しかし、その後、私はしばらくの間、別のタブに切り替え

、と返し、それが1だけ更新し、その時点で、更新するために、その数に数秒かかります。これは、ワーカーが実際には一時停止しているためです。この特定のアプリケーションでは問題ありません。また、ワーカーがまだ実行されている可能性がありますが、コンソールAPIは親が表示されていない場合。わからない。

私が解決しようとしている重要なことは、私がタブに戻るときの遅延です。それが応答的に更新されるダッシュボードの場合、更新が継続するまでに10〜60秒の遅延が目立ち、UIパフォーマンスのバグです。

オーナーのタブがフォーカスを失ったときにWebワーカーに何が起こるかについて、誰かが洞察していますか?実際に(XHRメッセージ上で)実行する必要がある作業の各インスタンスをキューイングして、所有者が戻ったときにそれを実行していますか?

フォーカスを失ったときに手動でポーリング機能を一時停止すると、

+0

あなたは、ログ出力にタイムスタンプを追加すると考えていますか?難しいことのように聞こえません。 –

+0

これは、たとえば、アイドル状態になっているワーカーか、メッセージチャネルかコンソールかを検証します。私は別のもののためにいくつかのために労働者を使用していた、彼らはタブを離れるときに中断しなかったので、私は問題が他の場所にあると思う理由があります。 –

+0

私が思うと、ワーカーがまだ稼働していた場合、出力のタイムスタンプは一貫性があります(たとえば、30秒ごとに1つ)。正直言って、最初にすべきことは、問題を示すjsFiddleを作ることです。今私はこれを引き起こす可能性があることを推測しているだけです。あなたがコードを簡素化するときにもそれが起こりますか? –

答えて

3

この動作はブラウザによって異なります。タブが使用されていない場合、CPUのサイクルとパフォーマンスのオーバーヘッドを維持するために、JavaScriptの優先順位が低下します。私はいくつかのブラウザが完全にタブの実行を中断すると考えているので、それは焦点が合うまで一時停止になります。私はFirefoxにこれを制御するオプションがあると思う。

+0

デフォルトでは、私が使用しているブラウザでのメインスレッドの実行は、ほとんど妨げられません。さて、歴史的に私はポーリングを一時停止する明示的な方法を実装しています(データは必要ありません、なぜそれを求めていますか?)が、この予期しない動作は私にとって不思議です。ウェブワーカーに関して、Chromeの戦略がデフォルトでどのように考えられていますか? –

0

WebWorkersは、それらを作成したページに密接に拘束されています。デフォルトの動作は、WebWorkerがアクティブでないときにWebWorkerを一時停止することです。

典型的な問題のシナリオはWebSocketを管理するWebWorkerです。そのネットワーク接続は、実行が中断されてもメッセージは受信されていても処理されていない場合でも有効です。これによりWebSocketの内部ネットワークバッファがオーバフローします。これは基本的にメモリリークであり、システム全体がクラッシュする可能性があります。

解決策は、SharedWorkersを作成したページに固く結合されておらず、フォーカス損失を無視してページ間で動作するように設計されたSharedWorkersを使用することです。 WebSocketのシナリオは、SharedWorkerの完璧な使い方です。

SharedWorkerのユースケースは、常に実行されており、他のページやアプリケーションのパフォーマンスに影響する可能性があるため、よく理解しておく必要があります。

今すぐ遊びに行く:http://coolaj86.github.io/html5-shared-web-worker-examples

関連する問題