ホームページ ウェブフロントエンド jsチュートリアル JavaScript スレッド_JavaScript スキルについて話しましょう

JavaScript スレッド_JavaScript スキルについて話しましょう

May 16, 2016 pm 03:50 PM
javascript

コード判定 1:

<div id="div">
  click me
</div>

<script>
  var div=document.getElementById("div");
  div.addEventListener('click',function(){
   alert('You have clicked me!');
  });
  for(var i =0; i<999999999;i++){
   console.log(i);
  }
</script>

ログイン後にコピー

実行すると、他に何も起こらなければすべてのブラウザがフリーズします。これは、JavaScript がシングルスレッドであるという事実に基づいて、上記の for ループが多すぎるため、大量の CPU リソースが消費され、ブラウザの UI レンダリングが一時停止されます。アニメーションが一時停止します。

さて、上記のコードを実装したいのですが、どうすればよいでしょうか?

Concurrent.Thread.js
このクラス ライブラリは基本的に setTimeout を使用して「偽のマルチスレッド」を実装します。 HTML5 WebWorker が登場する前は良い選択でした。たとえば、上記の「コード スニペット 1」を実装したい場合は、次のように記述できます (クラス ライブラリをダウンロードするには、[私] をクリックしてください):

コードスニペット 2:

<div id="div">
  click me
</div>
<script src="Concurrent.Thread.js"></script>
<script>
  Concurrent.Thread.create(function(){
    var div=document.getElementById("div");
    div.addEventListener('click',function(){
     alert('You have clicked me!');
    });
    for(var i =0; i<9999999;i++){
     console.log(i);
    }
  });
</script>

ログイン後にコピー

「新しいスレッド」は、このクラス ライブラリが提供する create メソッドを通じて作成できます。さらに、script タグの type 属性を text/x-script.multithreaded-js に設定することでも、同じ効果を達成できます:

コードフラグメント 3:

<div id="div">
  click me
</div>
<script src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
    var div=document.getElementById("div");
    div.addEventListener('click',function(){
     alert('You have clicked me!');
    });
    for(var i =0; i<9999999;i++){
     console.log(i);
    }
</script>
ログイン後にコピー

ウェブワーカー
HTML5 は、上記のブラウザがスタックするというユーザー エクスペリエンスの悪さから目をそむけることができるでしょうか?

次に、古典的なフィボナッチ数列を使用してテストします。

コードフラグメント 4:

メインページ:

<div id="div"></div>
<script>
  window.onload=function(){
     var div=document.getElementById("div");
     if(typeof(Worker)!=="undefined"){//在创建WebWorker之前,先判断浏览器是否支持
        console.log("Start calculating....");
       var time1= new Date()*1;//获得当前时间戳
       var worker=new Worker("fibonacci.js");//创建WebWorker对象,并传递在新线程中将要执行的脚本的路径
       worker.onmessage=function(e){ //监听从新线程发送过来的数据
         div.innerHTML=e.data;
         var time2=new Date()*1;
         console.log("time spend:"+(time2-time1)+"ms");
       }
        
       worker.postMessage(36);//向新线程发送数据
     }else{
       alert("Your browser do not support WebWoker");
     }
  }
</script>

fibonacci.js:
var fibonacci=function (n){
  return n<3&#63;n:(arguments.callee(n-1)+arguments.callee(n-2));
}
onmessage=function(e){
  var num=parseInt(e.data,10);
  postMessage(fibonacci(num));//向主页面发送数据
}

ログイン後にコピー

基本的な使用法はコード内にコメントされています。コンソールを見ると、すぐに実行時間が出力されることがわかります。そのため、フロントエンドで複雑かつ大規模な計算を実行するには WebWorker が適しているという結論に達しました。 WebWorker はクロスドメインをサポートしていないことに注意してください。ローカル テストでは引き続き http プロトコルを使用する必要があります。それ以外の場合は、Worker オブジェクトを作成できず、スクリプト エラーが報告されます。

複数の postMessage 操作を連続して実行する必要がある場合は、次のように work.postMessage を常に書かないことをお勧めします。

    worker.postMessage(36);

    worker.postMessage(36);

    worker.postMessage(36);

ログイン後にコピー

現時点では WebWorker インスタンスが 1 つしかないため、postMessage は非同期ではなく順次実行されるため、そのパフォーマンスを最大限に活用できません。 WebWorkerインスタンスを複数作成することでデータを送信できます。

注意すべき点がいくつかあります:

1. WebWorker が URL を受け入れることによってワーカーを作成することを確認しました。jsonp の実装原理は、スクリプト タグを動的に挿入することによってデータをロードすることです。同じことを実現するために WebWorker を使用してみるとよいのではないでしょうか。 ? WebWorker はマルチスレッドであり、ブロッキングがないので、美しいと思いませんか?しかし実際には、実験の結果、WebWorker のパフォーマンスが満足のいくものではないことがわかりました。したがって、これはこのウイルスの得意分野ではないため、それに引き継がれるべきではありません。

2. WebWorker が他のソースから情報を受け取ると、実際にはサイトのセキュリティに隠れた危険がもたらされ、未知のソースからスクリプト情報を受け取ると、XSS インジェクション攻撃につながる可能性があります。したがって、上記の例で innerHTML を使用するのは安全ではありません。代わりに、最新のブラウザーが提供する innerText または textContent を使用して HTML タグを除外することができます。

今日はとても疲れたので寝たいので、とりあえずこれくらい書きます。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

C++ 同時プログラミング: スレッドの枯渇と優先順位の逆転を回避するには? C++ 同時プログラミング: スレッドの枯渇と優先順位の逆転を回避するには? May 06, 2024 pm 05:27 PM

スレッドの枯渇を回避するには、公平なロックを使用してリソースの公平な割り当てを確保するか、スレッドの優先順位を設定します。優先順位の逆転を解決するには、リソースを保持しているスレッドの優先順位を一時的に高める優先順位の継承を使用するか、リソースを必要とするスレッドの優先順位を高めるロック プロモーションを使用します。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

C++ 同時プログラミング: スレッドの終了とキャンセルを行うには? C++ 同時プログラミング: スレッドの終了とキャンセルを行うには? May 06, 2024 pm 02:12 PM

C++ のスレッド終了およびキャンセル メカニズムには次のものがあります。 スレッド終了: std::thread::join() は、ターゲット スレッドが実行を完了するまで現在のスレッドをブロックします。 std::thread::detach() は、ターゲット スレッドをスレッド管理から切り離します。スレッドのキャンセル: std::thread::request_termination() はターゲット スレッドに実行の終了を要求します。 std::thread::get_id() はターゲット スレッド ID を取得し、std::terminate() とともに使用してターゲットを即座に終了できます。糸。実際の戦闘では、request_termination() によってスレッドが終了のタイミングを決定でき、join() によってメインラインでそれが保証されます。

See all articles