JavaScriptマルチスレッド


10

まあ最近JavaScriptはすべてのWeb開発テクノロジーのメインプレーヤーです。クライアント側では、ユーザーインターフェイスを改善するために、クライアント側のロジックで、一部のWebサーバーではサーバー側のロジックとしても使用されます

これに加えて、人々(少なくとも一部の人々)の事実が、Webゲーム開発をフラッシュからJavaScriptおよびHTML5に移行し始めました

マルチスレッドをサポートする時ではありませんか?JavaScriptをマルチスレッド化できるブラウザはありますか、それとも標準、HTML5、または将来のバージョンにありますか?


1
人々は必要のないことをしません。Javascriptの設計に貢献してきた人々は、開発中のWebサーバーやブラウザーに関連しているため、Javascriptのことも知っています。それは実用性についてすべてです。
Dipan Mehta

回答:


9

マルチスレッドはEcmaScriptでは実行されませんが、ホスト環境で公開できます。

典型的な例はWebWorkersです。これにより、バックグラウンドワーカーを起動して、<iframe>新しいプロセスを生成する方法としてを使用して作業を行うことができます。

JavaScriptでのマルチスレッドは必要ありません(例外はありますが、主にグラフィックス関連のプログラムです)。マルチスレッドは必要ありません。すでにGUIのイベントループがあり、グラフィックスレンダリング(キャンバス)はハードウェアアクセラレーションです(つまり、GPUがグラフィックスを並列にレンダリングします)。

webclのようなプロジェクトはとてもエキサイティングですが。


2
それが「必要ない」という事実を拡張できますか?私は最近、デスクトッププログラミングの自然なケースがタスクを処理するためのスレッドを生成することになるインスタンスに出くわしましたが、それは明らかに簡単で標準的なオプションではありませんでした。私はそのケースを回避しましたが、スレッドを生成する方がよりエレガントな解決策のようでした。
リグ

@リグあなたが処理しようとしていたケースは何でしたか?
Zachary K

@Rigは具体的な例を示します。クライアント側のJavaScriptで計算コストの高い処理が行われることはまれです
Raynos

@Raynosはそれが必要とされない方法について詳しく説明してください、たとえばゲーム開発において、グラフィックスと物理学とロジックの重い計算がある場合、マルチスレッドがないと簡単に影響を受けると私は思います
Ali

@アリ私は脱出して、例外があると言いました。ただし、その重い計算のほとんどは、ハードウェアアクセラレーショングラフィックAPIを介してGPUに与える必要があります
Raynos

4

番号

マルチスレッディングは、ソフトウェアを正しく機能させるのが最も難しいものの1つです。コードが確定的でない場合に解決するのが非常に難しいコーナーケースが非常に多くあります。(私はロックなどのマルチスレッドについて話している)。さらに、さまざまなJavaScriptライブラリはすべて、マルチスレッド化されていないことを前提として構築されています。

そうは言っても、マルチプロセッシングタイプの操作を実行するためのアクターベースのフレームワークを提供するWebワーカーは存在します。ワーカーを作成し、イベントを介してデータをやり取りできます。

編集: もう1つの理由は、JavaScriptが作成されたときに、小さなタスクに使用されることを想定して作成されたため、同時実行性は組み込まれていませんでした。これを改造すると、多くのコードが壊れます。Webワーカーを追加することで、共有メモリなしで同時実行が可能なシステムを作成できましたが、アクターを使用することで、Erlang、Scala、Clojureなどの他の多くの言語で非常に堅牢であることが示されている同時実行のモデル等

(ロックベースの同時実行性が本当に嫌いであると言えない場合)


1
Multi threading is one of the hardest things in software to get right.-びっくりしました!使用しているブラウザ、デスクトップのOS、このページを提供するWebサーバー-日常的に使用するほとんどすべてのアプリケーションはマルチスレッド化されています。あなたはそれを意味しますか?まだあなたに反対票を投じますが、あなたが言うなら私はそうしますmultithreading is not done because it is hard
Dipan Mehta

3
@DipanMehtaマルチスレッディング、ソフトウェアを正しく機能させるのが最も難しいものの1つです。これらすべてのアプリケーションがそれを使用する理由は、それらが本当に才能のある人々
Raynos

@Raynos-私の良さ!だからあなたは私を才能のある人と呼んでいます!私は毎日それを使用しています...あなたがCプログラミングまたは大規模なアプリケーションであるとき、それは非常に一般的だと思います。重要なのは、使用方法や要件に関係なく、W3CコンソーシアムはJavascript を非常に難しくしたので、Javascriptにそれを惜しみませんでした。
Dipan Mehta

2
正確で効率的な並列プログラムを作成することがいかに難しいかを非常に過小評価しています。しかし、マルチスレッドはJavaScriptにはありません。その不必要な複雑さ(この問題は3週間で書かれたものです)
Raynos

2
@DipanMehtaがロックベースの同時実行を正しく実行し、すべてのコーナーケースを特定することは難しい問題です。たとえば、すべてのケースで正しいことが証明できるロック付きのキューのような単純なものの実装は、数年前まで公開可能な結果でした。しかし、もっと重要なのは、それをそれがなかった言語に改造しようとすることは、問題を求めていることです。
Zachary K

3

マルチスレッド化のためにJavaScriptを開くと、解決する以上の問題が発生します。

現在のアーキテクチャーはシングルスレッドのイベントベース(つまり、GUIスレッドで実行される頻度が高い)です。つまり、コードのすべてのブロックで、変更されたものを除いて、環境内の最初から最後まで何も変更されないことが保証されます。コードで。

プリエンプションまたは並列実行を許可するとすぐに、この機能はなくなります。これは、変更するデータにロックを適用する必要があることと、回避するために競合状態全体をデバッグするのが難しいことを意味します。

タイムアウトを使用して疑似並列実行することが可能です。これは、実行時間の長い関数をアトミックチャンクに分割しsetTimeout(function(){nextstep(args);},1);、必要に応じて他のものを実行できるようにするために使用します


0

IntelはRiver Trailを少し前にリリースしました。これにより、Javascriptでの並列プログラミングが可能になります。ただし、これはFirefoxのみのプラグインであり、このテクノロジーをW3Cに導入するロードマップについては聞いていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.