それは意図的な設計の決定なのか、それとも今後のバージョンで修正される今日のブラウザーの問題なのか?
それは意図的な設計の決定なのか、それとも今後のバージョンで修正される今日のブラウザーの問題なのか?
回答:
ブラウザのJavaScriptインタプリタはシングルスレッド(AFAIK)であるため、JavaScriptはマルチスレッドをサポートしていません。Google Chromeでも、単一のWebページのJavaScriptを同時に実行することはできません。これは、既存のWebページで大規模な同時実行の問題が発生するためです。Chromeはすべて、複数のコンポーネント(異なるタブ、プラグインなど)を別々のプロセスに分離していますが、1つのページに複数のJavaScriptスレッドがあるとは思えません。
ただし、提案さsetTimeout
れたように、ある種のスケジューリングと「偽の」並行性を許可するために使用できます。これにより、ブラウザーはレンダリングスレッドの制御を取り戻しsetTimeout
、指定されたミリ秒後に指定されたJavaScriptコードを開始します。これは、ビューポートでの操作中にビューポート(表示されているもの)を更新できるようにする場合に非常に役立ちます。たとえば座標をループし、それに応じて要素を更新するだけで、開始位置と終了位置だけが表示され、その間に何も表示されません。
JavaScriptで抽象ライブラリを使用して、すべて同じJavaScriptインタープリターで管理されるプロセスとスレッドを作成できます。これにより、次の方法でアクションを実行できます。
これにより、何らかの形のスケジューリングと偽の並列処理、スレッドの開始と停止などが可能になりますが、本当のマルチスレッドではありません。真のマルチスレッド化は、ブラウザが単一ページのマルチスレッド化(または複数のコア)を実行できる場合にのみ有用であり、その難しさははるかに大きいので、私はそれが言語自体に実装されることはないと思います余分な可能性より。
JavaScriptの将来については、https: //developer.mozilla.org/presentations/xtech2006/javascript/をご覧ください。
JavaScriptマルチスレッド(制限あり)はこちらです。GoogleはGearsのワーカーを実装し、ワーカーはHTML5に含まれています。ほとんどのブラウザでは、この機能のサポートがすでに追加されています。
ワーカーとの間でやり取りされるすべてのデータがシリアル化/コピーされるため、データのスレッドセーフが保証されます。
詳細については、以下をお読みください。
伝統的に、JSは短くて高速に実行されるコードを対象としていました。大きな計算が行われている場合は、サーバー上で計算を行いました。ブラウザで長時間実行され、自明ではないことを実行するJS + HTML アプリのアイデアは、ばかげたことです。
もちろん、今はそれがあります。ただし、ブラウザが追いつくには少し時間がかかります-それらのほとんどはシングルスレッドモデルを中心に設計されており、変更は簡単ではありません。Google Gearsは、バックグラウンド実行を分離することを要求することにより、多くの潜在的な問題を回避します-DOMを変更せず(スレッドセーフではないため)、メインスレッドによって作成されたオブジェクトにアクセスしません(同上)。これは制限的ですが、ブラウザーの設計を簡素化するためと、経験の浅いJSプログラマーがスレッドをいじることを許すことに関連するリスクを減らすため、近い将来、最も実用的な設計になるでしょう...
Javascriptでマルチスレッドを実装しない理由は何ですか?プログラマは自分が持っているツールを使って、好きなことを何でもできます。
それでは、他のすべてのWebサイトを開いたときにブラウザーがクラッシュするほど簡単に誤用できるツールを与えないでください。これの素朴な実装は、IE7の開発中にMSに多くの頭痛の種をもたらした領域に直接あなたを連れて行きます:アドオンの作者はスレッドモデルで速くて緩やかに遊んだ結果、オブジェクトのライフサイクルがプライマリスレッドで変更されたときに明らかになる隠れたバグをもたらしました。悪い。IE用のマルチスレッドActiveXアドオンを作成している場合、それは領域に付属していると思います。それ以上の必要があるという意味ではありません。
この決定の根拠はわかりませんが、setTimeoutを使用してマルチスレッドプログラミングの利点のいくつかをシミュレートできることを知っています。複数のプロセスが同時に物事を行っているような錯覚を与えることができますが、実際にはすべてが1つのスレッドで発生します。
関数に少し仕事をさせて、次のようなものを呼び出します:
setTimeout(function () {
... do the rest of the work...
}, 0);
また、UIの更新、アニメーション画像など、実行する必要のあるその他のことは、機会があったときに発生します。
loop
内部を使用する必要がありますが、setTimeout
それは機能しません。あなたはそのようなことをしましたか、それともハックしましたか?例としては、1000要素の配列の場合、2つのsetTimeout
呼び出し内で2つのforループを使用して、最初のループがelementを印刷し0..499
、2番目のループがelementを印刷するようにします500..999
。
Node.js 10.5以降は、実験的な機能としてワーカースレッドをサポートしています(--experimental-workerフラグを有効にして使用できます):https : //nodejs.org/api/worker_threads.html
したがって、ルールは次のとおりです。
ワーカースレッドは、長期間存続するスレッドを対象としています。つまり、バックグラウンドスレッドを生成し、メッセージパッシングを介して通信します。
そうでない場合、無名関数で重いCPU負荷を実行する必要がある場合は、ワーカースレッドを中心に構築された小さなライブラリであるhttps://github.com/wilk/microjobを使用できます。
IntelはJavascriptでのマルチスレッド化に関するオープンソースの研究を行っており、最近GDC 2012で紹介されました。ビデオへのリンクは次のとおりです。研究グループは、主にIntelチップセットとWindows OSに焦点を当てたOpenCLを使用しました。プロジェクトのコード名はRiverTrailで、コードはGitHubで入手できます
さらに役立つリンク:
現在、一部のブラウザはマルチスレッドをサポートしています。したがって、必要な場合は、特定のライブラリを使用できます。たとえば、次の資料をご覧ください。
スレッドの同期のための適切な言語サポートがなければ、新しい実装で試しても意味がありません。既存の複雑なJSアプリ(例:ExtJSを使用するもの)は予期せずクラッシュする可能性が高いですが、synchronized
キーワードまたは類似のものがなければ、正しく動作する新しいプログラムを作成することも非常に困難または不可能ですらあります。
ただし、eval関数を使用して、並行性をある程度拡張することができます。
/* content of the threads to be run */
var threads = [
[
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');",
"document.write('Foo <br/>');"
],
[
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');",
"document.write('Bar <br/>');"
]
];
window.onload = function() {
var lines = 0, quantum = 3, max = 0;
/* get the longer thread length */
for(var i=0; i<threads.length; i++) {
if(max < threads[i].length) {
max = threads[i].length;
}
}
/* execute them */
while(lines < max) {
for(var i=0; i<threads.length; i++) {
for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
eval(threads[i][j]);
}
}
lines += quantum;
}
}
JavaScriptによるマルチスレッド化は、HTML5によってもたらされるWebワーカーを使用して明らかに可能です。
ウェブワーカーと標準のマルチスレッド環境の主な違いは、メモリリソースがメインスレッドと共有されないこと、オブジェクトへの参照がスレッド間で表示されないことです。スレッドはメッセージを交換することによって通信するため、イベント駆動型の設計パターンに従って、同期および同時メソッド呼び出しアルゴリズムを実装することが可能です。
スレッド間のプログラミングを構築できる多くのフレームワークが存在します。その中には、OODK-JS、並行プログラミングをサポートするOOP jsフレームワークがあります 。https://github.com/GOMServices/oodk-js-oop-for-js