問題タブ [web-worker]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - Processing.js と Web Worker の力を組み合わせる
私は Javascript 言語の 2 つの (比較的) 新しい概念、Web Workers と John Resig の素晴らしい Processing.js (実際には新しい「Javascript の概念」ではありませんが、私の考えはわかります) について読んでいます。両方の優れた例がインターネットを徘徊していますが、両方の手法を効果的に使用する例をまだ見つけていません。私にはかなり面白くて強力に見えるので、試してみようと思いました。
しかし、この 2 つを統合するための最適なスクリプト設計を実際に把握することはできません... 通常、Processing.js を使用する場合、「処理アプリケーション」内でいくつかのクラスが定義されているように思えます。これにより、Java のような構文を使用してこれを行うことができます。ただし、これらのクラスは Processing-application 内でしかアクセスできません。これは明らかです。しかし、次に Workers を取得します...この驚くべき例では、Javascript 関数オブジェクトが最初に別のスクリプトで定義されます。Worker の使用が必要な場合は、Worker スクリプトがそのオブジェクトのプロトタイプと種類の「ボルト」をインポートします。それ自体。
Worker スクリプトを使用している場合、Processing-application で定義したクラスにアクセスできないという点で、この 2 つは「互換性がある」とは思えません。おそらく、Processing に似たクラスは Javascript にあまり似ていないため、おそらく理由があります。私が見る限り、Worker スクリプトで (新しい関数プロトタイプの形式で) クラスの同様の定義を作成する必要があります。これは保守性にあまり良くなく、ひどく悪い設計のように思えます。私はまだこの件に関しては初心者ですが。
私は何かを見落としていますか?本来あるべきではないものが欲しいですか?それとも、いくつかの基本的な概念を誤解しているだけですか?
助けてくれてありがとう!
編集:
Worker のプロトタイプをいじって、それが機能するはずのオブジェクトのようにそれを「形作る」ことを試みましたが、すぐにこれが進むべき道ではないことに気付きました。
動作するアウトラインを試してみましょう: 私はクラス 'Ball' を持っていますが、これは 2 次元の位置を保存すること以外はほとんど何もしません。draw()
Processing.js はすべてのサイクルでそのupdate()
メソッドを呼び出し、Ball に新しい位置を採用させます。その後、display()
メソッドが呼び出され、Ball が現在の位置に小さな円を描画します。
最初から複雑なことは何もありません。ここで、ボールの新しい位置を特定するのはかなりコストのかかる操作であると仮定します。たとえば、「複雑な」重力場をボールが移動する場合などです。この計算を描画の前に毎回実行する必要がある場合、少なくともいくらかの遅延が発生します。ただし、これらを同時に行うことができれば、よりスムーズに実行できる可能性があります。そこで、Ball クラスのプロパティ リストに追加の 'positions' 配列を与えることができると考えました。これにより、連続するすべての位置が保持されます。Ball がインスタンス化されると、位置の計算を開始する新しい Worker が作成され、位置の計算が完了するたびに、新しい 2 次元位置を含むメッセージが Ball にポストバックされます。次に、ボールはこれを位置配列にプッシュします。
全体として、良いアイデアか悪いアイデアか?良い場合、これを設計する方法について何か提案はありますか?
javascript - postMessage 経由で渡されるように Web ワーカーでオブジェクトをエンコードするにはどうすればよいですか?
内部的に、Firefox は、postMessage を介して Web ワーカーとの間で渡されるオブジェクトを JSON エンコードします。ただし、これは Firefox (3.6+) の Trunk ビルドでのみ機能し、Firefox 3.5 では機能しないため、問題は、この操作の後方サポートを現在のプラットフォームに追加する方法です。window.atob() および window.btoa() メソッドは以前に提案されていましたが、残念ながらこれらは DOM にアクセスできないため、スレッドの内部では使用できません。
Mozilla は開発者 wiki でこれを公に述べていますが、コミュニティの多くの人がこれが起こることに気づいています。ejohn のブログ テストを確認してください: http://ejohn.org/files/bugs/postMessage/
これも同様であることを確認しました。3.5 では文字列のみを渡し、3.6 ではオブジェクトを渡します。
javascript - postMessage JSON は Firefox と同じように Google Chrome でエンコード/デコードされますか?
HTML5 仕様の一部は知っていますが、WebKit が仕様の最新のドラフトに準拠していないことがあります。
javascript - Webワーカー自体がWebワーカースレッドを持つことは許可されていますか?
これはFirefox3.5以降の場合のように思われます。そこで、Webワーカーをインスタンス化し、ワーカー内で別のスレッドを生成できます。ただし、コードはGoogle Chromeで機能しないため、これは仕様に対するMozilla独自の拡張機能であるか、Chromeが仕様を完全に実装していないと思われます。それで、それはどれですか?
javascript - Web Worker から Firebug と対話するにはどうすればよいですか?
私の Web ワーカーはますます複雑になり、作業中に Firebug にアクセスできなくなりました。これ:
Web ワーカーからは何も生成しません。私も次のことを試しました:
そして、それも出力を生成しません。
Firefox のバージョン:
Firebug バージョン 1.4X.5
javascript - Webワーカーとキャンバス
Webワーカーはキャンバスオブジェクトにアクセスできますか?
javascript - Web ワーカー間で変数を共有しますか? [グローバル変数?]
2 人の Web ワーカー間で変数を共有する方法はありますか? (Web ワーカーは基本的に Javascript のスレッドです)
C# のような言語では、次のようなものがあります。
これが悪い例であることは承知していますが、私の Javascript アプリケーションでは、複数のスレッドに分散できる大量の計算を実行するスレッドがあります [配列の形式で大量のデータがあるためです。配列のすべての要素は互いに独立しています。言い換えれば、私のワーカースレッドはロックなどを気にする必要はありません]
2 つのスレッド間で変数を「共有」する唯一の方法は、Getter/setter を [プロトタイピングを介して] 作成し、postMessage/onmessage を使用することであることがわかりました。 AFAIKにJSONを使用するには]
LocalStorage/Database は、デッドロックが発生する可能性があるため、HTML5 仕様から除外されました。[残念ながら] オプションではありません...
私が見つけた他の可能性は、PHP を使用して getVariable.php および setVariable.php ページを実際に作成することでした。これらのページは、localstorage を使用して ints/strings を格納します...もう一度、[配列/null を含む] オブジェクトを次のように変換する必要があります。 JSON...そしてその後、JSON.parse()'d。
私の知る限り、Javascript ワーカー スレッドはメイン ページ スレッドから完全に分離されています [これが、Javascript ワーカー スレッドが DOM 要素にアクセスできない理由です
postMessage は機能しますが、遅いです。
javascript - ワーカー スレッドの window.alert
webworker クライアントに window.alert を配置すると、バックグラウンド ワーカーが動作しなくなります。これはなぜですか?
つまり、発信者:
クライアント (worker.js)
javascript - Web ワーカーのユースケースは何ですか?
Web Workers APIを使用するための実際のシナリオを探しています。