20

したがって、コードで使用したいこの真剣に再帰的な関数があります。問題は、jsがシングルスレッドであるため、デュアルコアマシンを実際に利用していないことです。私はwebworkersを使ってみましたが、マルチコアプログラミングについてはあまりよく知りません。誰かがそれがどのように行われるかを説明できるいくつかの資料を私に指摘しますか?私はこのサンプルリンクを見つけるためにグーグルで検索しましたが、ドキュメントなしではあまり役に立ちません!= /

しかし、誰かがWebworkerなしでこれを行う方法を教えてくれたら嬉しいです!それは素晴らしいでしょう!=)

私はwhatwgでこのリンクに出くわしました。これは、Webworkerなどでマルチコアプログラミングを使用する方法を説明しているため、本当に奇妙ですが、私のChromeブラウザーで実行すると、エラーが発生します。同じことが他のブラウザにも当てはまります。

エラー:9Uncaught ReferenceError:ワーカーがworker.jsで定義されていません

4

3 に答える 3

12

更新(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ワーカーには何も問題はありません。

于 2012-05-30T13:09:57.860 に答える
5

私が覚えている限り、これは新しい HTML5 標準でのみ可能です。キーワードは「Webワーカー」

以下も参照してください。

HTML5: JavaScript Web ワーカー

HTML5 Web ワーカーを使用した JavaScript スレッド化

于 2010-12-15T12:19:21.983 に答える
4

Web ワーカーは、クライアント側に対する答えです。NodeJS には多くのアプローチがあります。最も人気のある -pm2または同様のツールを使用して複数のプロセスを生成します。単一プロセスを実行し、子プロセスを生成/フォークします。これらをグーグルで検索すると、多くのサンプルと戦術が見つかります。

Web ワーカーは、すべてのブラウザーで既に十分にサポートされています。https://caniuse.com/#feat=webworkers

API とサンプル: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

ここに画像の説明を入力

于 2018-10-09T04:10:08.320 に答える