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("
});
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 を配置しました。ノードから直接接続できます)。

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
