ホームページ ウェブフロントエンド jsチュートリアル JavaScript_javascriptスキルにおけるWebワーカーのマルチスレッドAPIに関する研究

JavaScript_javascriptスキルにおけるWebワーカーのマルチスレッドAPIに関する研究

May 16, 2016 pm 04:28 PM
api javascript web worker マルチスレッド化

HTML5 は Web Worker などの API をサポートしており、Web ページでマルチスレッド コードを安全に実行できるようになります。しかし、実際にはWeb Workerには多くの制限があり、メモリデータを完全に共有することはできず、ステータス通知もメッセージでしか行えないため、本当の意味での「マルチスレッド」とは言えません。

Web Worker のインターフェースは、基本的にサンドボックスが付属しており、サンドボックス内で独立した js ファイルを実行し、postMessage および onMessage を通じてメインスレッドと通信します。

コードをコピーします コードは次のとおりです:

var worker = new Worker("my.js");
var Bundle = {message:'Hello world', id:1};
worker.postMessage(bundle); //postMessage はシリアル化可能なオブジェクトを渡すことができます
worker.onmessage = function(evt){
Console.log(evt.data); //ワーカーから返されたオブジェクトとメインスレッドのオブジェクトを比較します
console.log(bundle); //{メッセージ:'Hello world', id:1}
}

コードをコピーします コードは次のとおりです:

//my.js内
onmessage = function(evt){
var data = evt.data;
データ.id ;
PostMessage(data); //{メッセージ:'Hello world', id:2}
}

得られた結果は、スレッド内で取得したデータのIDが増加していることがわかりますが、それが返された後、メインスレッドのバンドル内のIDは変化していないため、スレッドに渡されたオブジェクトが返されます。実際にはコピーされるため、その場合、スレッドはデータを共有せず、読み取りと書き込みの競合を回避できるため、安全です。スレッドの安全性を確保する代償として、スレッド内のメイン スレッド オブジェクトを操作する機能が制限されます。

このような制限されたマルチスレッド メカニズムは、使用するのが非常に不便です。たとえば、次のようなコードをサポートしているように Worker がサポートできることを期待しています。以下:

コードをコピーします コードは次のとおりです:

var worker = new ThreadWorker(bundle /*shared obj*/);

worker.run(function(bundle){
// ワーカースレッドで sth を実行します...
This.runOnUiThread(function(bundle /*shared obj*/){
// メイン UI スレッドで sth を実行します...
});
//...
});

このコードでは、ワーカーを開始した後、ワーカー内で任意のコードを実行でき、UI スレッドを操作する必要があるとき (DOM の読み取りと書き込みなど)、メイン スレッドに戻って実行できます。 this.runOnUiThread を通じて。

では、このメカニズムを実装するにはどうすればよいでしょうか? 以下のコードを見てください:

コードをコピーします コードは次のとおりです:

function WorkerThread(sharedObj){
This._worker = new Worker("thread.js");
This._completes = {};
This._task_id = 0;
This.sharedObj =sharedObj;

var self = this;
This._worker.onmessage = function(evt){
var ret = evt.data;
If(ret.__UI_TASK__){
// ui タスクで実行
var fn = (new Function("return " ret.__UI_TASK__))();
fn(ret.sharedObj);
}その他{
self.sharedObj = ret.sharedObj;
self._completes[ret.taskId](ret);
}
}
}

WorkerThread.prototype.run = function(タスク、完了){
var _task = {__THREAD_TASK__:task.toString()、sharedObj: this.sharedObj、taskId: this._task_id};
This._completes[this._task_id ] = 完了; This._worker.postMessage(_task);
}

上記のコードは、Thread.js を実行する Web ワーカーを作成し、共有オブジェクト SharedObj を保存し、thread.js によって返されたメッセージを処理する ThreadWorker オブジェクトを定義します。

thread.js から UI_TASK メッセージが返された場合は、メッセージによって渡された関数を実行します。それ以外の場合は、run の完全なコールバックを実行します。thread.js の記述方法を見てみましょう。

コードをコピーします コードは次のとおりです:

onmessage = function(evt){
var data = evt.data;

if(データ && データ.__THREAD_TASK__){
var task = data.__THREAD_TASK__;
試してみましょう{
var fn = (new Function("return " task))();

var ctx = {
threadSignal: true、
スリープ: 関数(間隔){
ctx.threadSignal = false;
setTimeout(_run, interval);
},
runOnUiThread: function(タスク){
PostMessage({__UI_TASK__:task.toString(),sharedObj:data.sharedObj});
}
}

関数 _run(){
ctx.threadSignal = true;
var ret = fn.call(ctx, data.sharedObj);
PostMessage({error:null, returnValue:ret, __THREAD_TASK__:task,sharedObj:data.sharedObj, taskId:data.taskId});
}

_run(0);

}キャッチ(例){
PostMessage({error:ex.toString(), returnValue:null,sharedObj: data.sharedObj});
}
}
}

ご覧のとおり、thread.js は ui スレッドからメッセージを受け取ります。その中で最も重要なものは THREAD_TASK です。これは、関数以降、ui スレッドによって渡され、ワー​​カー スレッドによって実行される必要がある「タスク」です。渡されるのは文字列です。ワーカー スレッドは文字列を関数に解析して、メイン スレッドによって送信されたタスクを実行します (実行完了後、共有オブジェクトsharedObj がタスクに渡されることに注意してください)。返された結果は、メッセージを通じて ui スレッドに渡されます。詳しく見てみましょう。戻り値 returnValue に加えて、共有オブジェクトsharedObjも返されます。これは、ワーカー スレッドと ui スレッドがオブジェクトを共有していないため、両方のオブジェクトを人工的に同期させます。割り当て (このスレッドは安全ですか? ? なぜですか? )

この実装後、この ThreadWorker は次の 2 つの方法で使用できることがわかります。

コードをコピー コードは次のとおりです:

var t1 = new WorkerThread({i: 100} /*共有オブジェクト*/);

setInterval(function(){
            t1.run(function(sharedObj){
                    戻りsharedObj.i ;
                }、
                関数(r){
                    console.log("t1>" r.returnValue ":" r.error);
                }
            );
        }, 500);
var t2 = 新しい WorkerThread({i: 50});

t2.run(function(sharedObj){
            while(this.threadSignal){
                共有オブジェクト;

this.runOnUiThread(function(sharedObj){
                    W("body ul").appendChild("

  • "sharedObj.i "
  • ");
                    });

    this.sleep(500);
                }
                戻りsharedObj.i;
            }、関数(r){
                console.log("t2>" r.returnValue ":" r.error);
            });

    このような使用方法は、形式と説明の両方から、良好な構造、電気活性、および耐久性を備えていると考えられます。

    よろしくお願いします。Web Worker の使用法探索については、ここにアクセスします。興味のある同学は次のこの項目を参照してください: https://github.com/akira-cn/WorkerThread.js (Worker が必要なサービスの調査のため) 、私は特に、非常に厳格な http サービスの js である 1 つの山に httpd.js を配置しました。ノードから直接接続できます)。


    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

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

    SublimeText3 中国語版

    SublimeText3 中国語版

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

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    C++ 関数の例外とマルチスレッド: 同時環境でのエラー処理 C++ 関数の例外とマルチスレッド: 同時環境でのエラー処理 May 04, 2024 pm 04:42 PM

    C++ での関数例外処理は、マルチスレッド環境でスレッドの安全性とデータの整合性を確保するために特に重要です。 try-catch ステートメントを使用すると、特定の種類の例外が発生したときにそれをキャッチして処理し、プログラムのクラッシュやデータの破損を防ぐことができます。

    PHPでマルチスレッドを実装するにはどうすればよいですか? PHPでマルチスレッドを実装するにはどうすればよいですか? May 06, 2024 pm 09:54 PM

    PHP マルチスレッドとは、1 つのプロセスで複数のタスクを同時に実行することを指します。これは、独立して実行されるスレッドを作成することによって実現されます。 PHP の Pthreads 拡張機能を使用して、マルチスレッド動作をシミュレートできます。インストール後、Thread クラスを使用してスレッドを作成および開始できます。たとえば、大量のデータを処理する場合、データを複数のブロックに分割し、対応する数のスレッドを作成して同時処理することで効率を向上させることができます。

    マルチスレッド環境での JUnit 単体テスト フレームワークの使用 マルチスレッド環境での JUnit 単体テスト フレームワークの使用 Apr 18, 2024 pm 03:12 PM

    マルチスレッド環境で JUnit を使用する場合、シングルスレッド テストとマルチスレッド テストという 2 つの一般的なアプローチがあります。シングルスレッド テストは同時実行性の問題を回避するためにメイン スレッドで実行されますが、マルチスレッド テストはワーカー スレッドで実行され、共有リソースが妨げられないように同期されたテスト アプローチが必要です。一般的な使用例には、マルチスレッド環境での JUnit のアプリケーションを反映する、キーと値のペアを格納するための ConcurrentHashMap の使用や、キーと値のペアを操作してその正しさを検証するための同時スレッドなど、マルチスレッド セーフなメソッドのテストが含まれます。 。

    Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか? Java 関数の同時実行性とマルチスレッド化によってパフォーマンスはどのように向上するのでしょうか? Apr 26, 2024 pm 04:15 PM

    Java 関数を使用した同時実行およびマルチスレッド技術により、次の手順を含むアプリケーションのパフォーマンスを向上させることができます。 同時実行およびマルチスレッドの概念を理解する。 Java の同時実行性と、ExecutorService や Callable などのマルチスレッド ライブラリを活用します。マルチスレッドの行列乗算などのケースを練習して、実行時間を大幅に短縮します。同時実行性とマルチスレッドによってもたらされる、アプリケーションの応答速度の向上と最適化された処理効率の利点をお楽しみください。

    C++ のマルチスレッドで共有リソースを処理するにはどうすればよいですか? C++ のマルチスレッドで共有リソースを処理するにはどうすればよいですか? Jun 03, 2024 am 10:28 AM

    ミューテックスは C++ でマルチスレッド共有リソースを処理するために使用されます。std::mutex を通じてミューテックスを作成します。 mtx.lock() を使用してミューテックスを取得し、共有リソースへの排他的アクセスを提供します。ミューテックスを解放するには mtx.unlock() を使用します。

    C++ でマルチスレッド プログラムをテストするための課題と戦略 C++ でマルチスレッド プログラムをテストするための課題と戦略 May 31, 2024 pm 06:34 PM

    マルチスレッド プログラムのテストは、非再現性、同時実行エラー、デッドロック、可視性の欠如などの課題に直面しています。戦略には以下が含まれます。 単体テスト: 各スレッドの単体テストを作成して、スレッドの動作を検証します。マルチスレッド シミュレーション: シミュレーション フレームワークを使用して、スレッド スケジューリングを制御しながらプログラムをテストします。データ競合の検出: valgrind などのツールを使用して、潜在的なデータ競合を見つけます。デバッグ: デバッガー (gdb など) を使用して、ランタイム プログラムのステータスを調べ、データ競合の原因を見つけます。

    マルチスレッド環境における C++ メモリ管理の課題と対策? マルチスレッド環境における C++ メモリ管理の課題と対策? Jun 05, 2024 pm 01:08 PM

    マルチスレッド環境では、C++ メモリ管理はデータ競合、デッドロック、メモリ リークなどの課題に直面します。対策には次のものが含まれます: 1. ミューテックスやアトミック変数などの同期メカニズムの使用、 2. ロックフリーのデータ構造の使用、 4. (オプション) ガベージ コレクションの実装。

    C++ テクノロジにおける例外処理: マルチスレッド環境で例外を正しく処理するにはどうすればよいですか? C++ テクノロジにおける例外処理: マルチスレッド環境で例外を正しく処理するにはどうすればよいですか? May 09, 2024 pm 12:36 PM

    マルチスレッド C++ では、例外処理は適時性、スレッドの安全性、明確性という原則に従います。実際には、ミューテックスまたはアトミック変数を使用することで、例外処理コードのスレッド セーフを確保できます。さらに、例外処理コードの再入性、パフォーマンス、テストを考慮して、コードがマルチスレッド環境で安全かつ効率的に実行されることを確認してください。

    See all articles