質問

これは意図的な設計上の決定でしょうか、それとも現在のブラウザの問題であり、今後のバージョンで修正される予定ですか?

役に立ちましたか?

解決

ブラウザーの JavaScript インタープリターはシングルスレッドであるため (私の知る限り)、JavaScript はマルチスレッドをサポートしていません。Google Chrome でも、単一の Web ページの JavaScript を同時に実行することはできません。これは、既存の Web ページで同時実行に関する大規模な問題が発生するためです。Chrome が行うことは、複数のコンポーネント (さまざまなタブ、プラグインなど) を個別のプロセスに分離することだけですが、1 つのページに複数の JavaScript スレッドがあることは想像できません。

ただし、提案されているように、次のように使用できます。 setTimeout ある種のスケジューリングと「偽の」同時実行を許可します。これにより、ブラウザはレンダリング スレッドの制御を取り戻し、ブラウザに提供された JavaScript コードを開始します。 setTimeout 指定されたミリ秒数が経過した後。これは、操作の実行中にビューポート (表示されているもの) を更新できるようにしたい場合に非常に便利です。ループするだけです。座標を取得し、それに応じて要素を更新すると、開始位置と終了位置だけが表示され、その間には何も表示されません。

JavaScript で抽象化ライブラリを使用すると、同じ JavaScript インタプリタによってすべて管理されるプロセスとスレッドを作成できます。これにより、次の方法でアクションを実行できるようになります。

  • プロセス A、スレッド 1
  • プロセス A、スレッド 2
  • プロセス B、スレッド 1
  • プロセス A、スレッド 3
  • プロセス A、スレッド 4
  • プロセス B、スレッド 2
  • プロセスAを一時停止する
  • プロセス B、スレッド 3
  • プロセス B、スレッド 4
  • プロセス B、スレッド 5
  • プロセスAを開始
  • プロセス A、スレッド 5

これにより、何らかの形式のスケジューリングが可能になり、並列処理、スレッドの開始と停止などが可能になりますが、それは真のマルチスレッドではありません。これが言語自体に実装されることは決してないと思います。真のマルチスレッドは、ブラウザが単一ページをマルチスレッド (または複数のコア) で実行できる場合にのみ有用であり、その場合の困難ははるかに大きいからです。余計な可能性よりも。

JavaScript の将来については、以下をチェックしてください。https://developer.mozilla.org/presentations/xtech2006/javascript/

他のヒント

伝統的に、JS は短くて高速に実行されるコード部分を目的としていました。主要な計算が行われている場合は、それをサーバー上で実行します - JS+HTML のアイデア アプリ ブラウザ内で長時間にわたって簡単ではないことを実行するのはばかげています。

もちろん、今ではそれができています。ただし、ブラウザーが追いつくには少し時間がかかります。ほとんどのブラウザーはシングルスレッド モデルを中心に設計されており、それを変更するのは簡単ではありません。Google Gears は、バックグラウンド実行を分離することを要求することで、多くの潜在的な問題を回避します。DOM を変更したり (スレッドセーフではないため)、メインスレッドによって作成されたオブジェクトにアクセスしたりしません (同上)。制限的ではありますが、ブラウザの設計が簡素化されることと、経験の浅い JS コード作成者がスレッドをいじることに伴うリスクが軽減されるため、これは近い将来最も実用的な設計になるでしょう...

@マルシオ:

それが Javascript でマルチスレッドを実装しない理由になるのはなぜでしょうか?プログラマーは、自分が持っているツールを使って、やりたいことを何でも行うことができます。

それなら、あまりにも簡単にできるツールを彼らに与えるのはやめましょう。 悪用 他のウェブサイトを開くたびにブラウザがクラッシュしてしまうのです。これを単純に実装すると、IE7 の開発中に MS に多くの頭痛の種をもたらした領域に直接到達することになります。アドオンの作成者はスレッド モデルを高速かつ緩く操作したため、プライマリ スレッドでオブジェクトのライフサイクルが変更されたときに隠れたバグが明らかになりました。悪い。IE 用のマルチスレッド ActiveX アドオンを作成している場合は、その領域が付属していると思います。それ以上進む必要があるという意味ではありません。

JavaScript マルチスレッド (いくつかの制限付き) がここにあります。Google は Gears にワーカーを実装しており、ワーカーは HTML5 に含まれています。ほとんどのブラウザは、この機能のサポートをすでに追加しています。

ワーカーとの間で通信されるすべてのデータはシリアル化/コピーされるため、データのスレッドセーフが保証されます。

詳細については、以下をお読みください。

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/

この決定の根拠はわかりませんが、setTimeout を使用するとマルチスレッド プログラミングの利点の一部をシミュレートできることはわかっています。複数のプロセスが同時に処理を行っているように見えることがありますが、実際にはすべてが 1 つのスレッドで行われます。

関数に少し作業をさせてから、次のようなものを呼び出します。

setTimeout(function () {
    ... do the rest of the work...
}, 0);

また、その他の必要な作業 (UI の更新、アニメーション画像など) は、機会があれば実行します。

マルチスレッド.js Web ワーカーをラップし、JS で簡単にマルチスレッド化できるようにします。iOS Safari を含むすべての新しいブラウザで動作します。:)

なぜ言語がマルチスレッドをサポートしないのか、それともブラウザの JavaScript エンジンがマルチスレッドをサポートしないのかということですか?

最初の質問に対する答えは、ブラウザーの JavaScript はサンドボックス内で、マシンや OS に依存しない方法で実行されることを目的としており、マルチスレッドのサポートを追加すると言語が複雑になり、言語が OS と密接に結びついてしまうということです。

マット b が言ったように、質問はあまり明確ではありません。この言語でのマルチスレッド サポートについて質問していると仮定します。現在ブラウザで実行されているアプリケーションの 99.999% には必要ないからです。本当に必要な場合は、回避策があります (window.setTimeout を使用するなど)。

一般に、追加の制限 (不変データのみを使用するなど) を設けない限り、マルチスレッドを正しく実行するのは非常に非常に非常に困難です (困難だと言いましたか?)。

Intel は Javascript のマルチスレッドに関するオープンソースの研究を行っており、最近の GDC 2012 で紹介されました。ここにリンクがあります ビデオ. 。研究グループは、主にインテル チップ セットと Windows OS に焦点を当てた OpenCL を使用しました。プロジェクトのコード名は RiverTrail で、コードは GitHub で入手できます。

さらに便利なリンクをいくつか示します。

Web アプリケーションのためのコンピューティング ハイウェイの構築

現在、一部のブラウザはマルチスレッドをサポートしています。したがって、必要に応じて特定のライブラリを使用できます。たとえば、次の資料をご覧ください。

Node.js 10.5以降をサポート ワーカースレッド 実験的な機能として (次のオプションで使用できます) --実験員 フラグが有効になっている): https://nodejs.org/api/worker_threads.html

したがって、ルールは次のとおりです。

  • する必要がある場合 I/O バウンド操作, 、内部メカニズム (別名 callback/promise/async-await) を使用します。
  • する必要がある場合 CPU バウンドの操作, 、その後、ワーカー スレッドを使用します。

ワーカー スレッドは、存続期間の長いスレッドであることを目的としています。つまり、バックグラウンド スレッドを生成し、メッセージ パッシング経由でバックグラウンド スレッドと通信します。

それ以外の場合、匿名関数で重い CPU 負荷を実行する必要がある場合は、次のようにすることができます。 https://github.com/wilk/microjob, 、ワーカースレッドを中心に構築された小さなライブラリです。

マルチスレッドをサポートしていない実装です。現在、Google Gears は外部プロセスを実行することで何らかの形式の並行性を使用する方法を提供していますが、それだけです。

Googleが本日リリースする予定の新しいブラウザ(Google Chrome)は、一部のコードをプロセス内で分割することで並列実行する。

もちろん、コア言語は、たとえば Java と同じサポートを持つことができますが、Erlang の同時実行性のようなもののサポートは、決して近い将来にはありません。

私が聞いた限りでは、Google Chrome にはマルチスレッド JavaScript が搭載される予定であるため、これは「現在の実装」の問題です。

によると この記事 JavaScript スレッドを実装することはすでに可能です。

スレッド同期のための適切な言語サポートがなければ、新しい実装を試しても意味がありません。既存の複雑な 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;
    }
}

Jetworker、Webworkerのラッパーを使用できますhttps://github.com/uxitten/jetworker

HTML5 によってもたらされる Webworkers を使用すると、JavaScript によるマルチスレッドが明らかに可能になります。

Web ワーカーと標準のマルチスレッド環境の主な違いは、メモリ リソースがメイン スレッドと共有されないこと、オブジェクトへの参照がスレッド間で認識されないことです。スレッドはメッセージを交換することによって通信するため、イベント駆動型の設計パターンに従って同期および同時メソッド呼び出しアルゴリズムを実装することが可能です。

スレッド間のプログラミングを構造化できるフレームワークは数多く存在しますが、その中には同時プログラミングをサポートする OOP js フレームワークである OODK-JS があります。https://github.com/GOMServices/oodk-js-oop-for-js

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top