更新(2018-06-21):JavaScriptでマルチコアプログラミングを探してここに来る人のために、必ずしもブラウザーJavaScriptではありません(そのため、答えはそのまま適用されます):Node.jsは、機能フラグ(--experimental-workers
):リリース情報、関連する問題。
これを頭のてっぺんから書き留めてください。ソースコードの保証はありません。気楽に行ってください。
私の知る限り、JavaScriptを使用してスレッドでプログラミングすることはできません。Webworkerは、マルチプログラミングの一形態です。それでも、JavaScriptは本質的にシングルスレッドです(イベントループに基づいています)。
Webworkerは、それを開始したスクリプトと何も共有しないという意味で、実行の別個のスレッドです。スクリプトのグローバルオブジェクト(通常、ブラウザでは「ウィンドウ」と呼ばれます)への参照はなく、スレッドに送信するデータ以外のメインスクリプトの変数への参照もありません。
Webワーカーは、質問を受けて回答を提供する小さな「サーバー」と考えてください。そのサーバーに送信できるのは文字列のみであり、文字列を解析して計算したものを送り返すことしかできません。
// in the main script, one starts a worker by passing the file name of the
// script containing the worker to the constructor.
var w = new Worker("myworker.js");
// you want to react to the "message" event, if your worker wants to inform
// you of a result. The function typically gets the event as an argument.
w.addEventListener("message",
function (evt) {
// process evt.data, which is the message from the
// worker thread
alert("The answer from the worker is " + evt.data);
});
次に、postMessage()を使用してこのスレッドにメッセージ(文字列)を送信できます-メソッド:
w.postMessage("Hello, this is my message!");
サンプルワーカースクリプト(「エコー」サーバー)は次のようになります。
// this is another script file, like "myworker.js"
self.addEventListener("message",
function (evt) {
var data = JSON.parse(evt.data);
/* as an echo server, we send this right back */
self.postMessage(JSON.stringify(data))
})
そのスレッドに投稿したものはすべて、デコード、再エンコード、および返送されます。もちろん、その間にやりたい処理は何でもできます。その労働者は活動を続けます。terminate()
(メインスクリプトで)それを呼び出して、w.terminate()
それを終了するかself.close()
、ワーカーを呼び出すことができます。
要約すると、あなたができることは、関数パラメーターをJSON文字列に圧縮し、それを使用して送信postMessage
され、デコードされ、「反対側」(ワーカー内)で処理されることです。計算結果は「メイン」スクリプトに返送されます。
これが簡単ではない理由を説明するために:より多くの相互作用は実際には不可能であり、その制限は意図的なものです。共有リソース(ワーカーとメインスクリプトの両方に表示されるオブジェクト)は、同時に2つのスレッドが干渉する可能性があるため、競合状態を防ぐために、そのリソースへのアクセス(つまり、ロック)を管理する必要があります。 。
メッセージパッシング、シェアードナッシングアプローチはそれほどよく知られていません。主な理由は、他のほとんどのプログラミング言語(CやJavaなど)が同じアドレス空間で動作するスレッドを使用しているためです(たとえば、Erlangなどの他の言語は使用していません)。 )。このことを考慮:
- 関連するデッドロック/競合状態の複雑さのために、ミューテックス(相互排除メカニズム)を使用して大規模なプロジェクトをコーディングすることは非常に困難です。これは成長した男性を泣かせることができるものです!
- メッセージパッシング、シェアードナッシングセマンティクスを実行するのと比較して、非常に簡単です。コードは分離されています。あなたはあなたの労働者に何が入り、あなたの労働者から何が出てくるかを正確に知っています。デッドロックと競合状態を達成することは不可能です!
試してみてください。それは面白いことをすることができます、おそらくあなたが望むすべて。私の知る限り、マルチコアを利用するかどうかはまだ実装によって定義されていることを覚えておいてください。
NB。少なくともいくつかの実装がメッセージのJSONエンコーディングを処理するという情報を受け取りました。
だから、あなたの質問に答えるために(それはすべて上記です; tl; drバージョン):いいえ、あなたはウェブワーカーなしでこれを行うことはできません。しかし、一般的なHTML5の場合のように、ブラウザーのサポートを除けば、Webワーカーには何も問題はありません。