9

私はWebワーカーを使用してCPUを集中的に使用していますが、ワーカーがまだ処理している間に、ワーカーが親スクリプトからのメッセージに応答する必要があります。

ただし、ワーカーは処理ループでロックされている間はメッセージに応答しません。また、メッセージキューをポーリングする方法が見つかりませんでした。したがって、唯一の解決策は、キュー内のすべてのメッセージを処理できるように、一定の間隔で処理を中断することであるように思われます。

明らかなオプションはタイマーを使用することです(たとえばsetIntervalを使用)が、起動間の最小遅延が非常に長いことを読みました(http://ajaxian.com/archives/settimeout-delay)。これは処理が遅くなるため残念です。多くの。

これについて他の人々はどう思いますか?onmessageそれぞれの最後にワーカーを自分自身にディスパッチさせてonmessage、自分から受け取ったイベントごとに処理ループの1つのステップを効果的に実装しようとしますが、誰かがこれについて何かアイデアを持っているかどうかを確認したかっただけです。

ありがとう、

4

3 に答える 3

5

ワーカーはサブワーカーを生成できます。メイン ワーカーをメッセージ キューとして機能させ、実行時間の長い操作の要求を受信すると、サブ ワーカーを生成してそのデータを処理することができます。その後、サブ ワーカーは結果をメイン ワーカーに送り返し、イベントをキューから削除して、結果をメイン スレッドに返すことができます。そうすれば、メイン ワーカーは常に自由に新しいメッセージをリッスンできるようになり、キューを完全に制御できます。

--ニック

于 2010-07-05T15:02:02.367 に答える
4

初めてワーカーと遊んでいるときに、この問題に遭遇しました。setInterval を使用することについても議論しましたが、これは問題に対するかなりハックなアプローチになると感じました (そして、エミュレートされたマルチスレッドで既にこの方法を使用していました)。代わりに、メイン スレッド (worker.terminate()) からワーカーを終了し、ワーカーが関与しているタスクを中断する必要がある場合はワーカーを再作成することにしました。私のテストではガベージコレクションなどは処理されているようでした。

これらのタスクから保存したいデータがある場合は、いつでもメイン スレッドに投稿して定期的に保存することができます。タスクが終了するかどうかに関して実装したいロジックがある場合は、投稿することができます。関連するデータは、それを可能にするのに十分な間隔で定期的に戻ってきます。

とにかく、サブワーカーを生成すると、同じ一連の問題が発生します。いくつかのロジックに従ってサブワーカーを終了する(または新しいサブワーカーを作成する)必要があり、それが(たとえばクロムで)十分にサポートされているかどうかはわかりません。

ジェームズ

于 2012-05-19T10:02:22.500 に答える
0

同じ問題を抱えて、Web ワーカーのドラフトを検索したところ、処理モデルセクションのステップ 9 から 12 に何かが見つかりました。私が理解している限り、タスクの処理を開始したワーカーは、最初のタスクが完了するまで別のタスクを処理しません。したがって、タスクの停止と再開を気にしない場合、nciagra の回答は、タスクの各反復のスケジュールを変更するよりも優れたパフォーマンスを提供するはずです。

まだまだ調査中ですが。

于 2010-10-02T00:25:19.193 に答える