ホームページ ウェブフロントエンド H5 チュートリアル Raid on HTML5 Javascript API Extension 1—Web Worker の非同期実行と関連する概要_html5 チュートリアルのスキル

Raid on HTML5 Javascript API Extension 1—Web Worker の非同期実行と関連する概要_html5 チュートリアルのスキル

May 16, 2016 pm 03:50 PM
web worker

JavaScript 実行メカニズム
HTML5 より前は、ブラウザでの JavaScript の実行はシングルスレッド方式で機能していましたが、マルチスレッドをシミュレートする方法は数多くあります (例: Javascript の setinterval メソッド、setTimeout メソッド) 、など)、しかし本質的には、プログラムの実行は依然として JavaScript エンジンによってシングルスレッド スケジューリング方式で実行されます。 HTML5 で導入されたワーカー スレッドにより、ブラウザ側の Javascript エンジンが Javascript コードを同時に実行できるようになり、ブラウザ側のマルチスレッド プログラミングの適切なサポートが実現します。

JavaScript の複数のスレッド - WebWorker
HTML5 の Web Worker は、2 つの異なるスレッド タイプに分けることができます。1 つは専用スレッド D dedicated Worker、もう 1 つは共有スレッド Sharedワーカー。どちらのタイプのスレッドも異なる目的を果たします。
専用 Web ワーカー
専用ワーカーは、それを作成したスクリプトに接続されますが、他のワーカーまたはブラウザ コンポーネントと通信できますが、DOM とは通信できません。専用の意味は、このスレッドが一度に 1 つの要件のみを処理することだと思います。 IEを除く各種主流ブラウザには専用スレッドが実装されており、安心してご利用いただけます。
スレッドの作成
ワーカーの作成は、スレッド内で実行する必要がある JavaScript ファイルのファイル名をコンストラクターに渡すだけです。
スレッド通信
メインスレッドとサブスレッド間の通信には、スレッドオブジェクトの postMessage メソッドと onmessage メソッドが使用されます。誰が誰にデータを送信するかに関係なく、送信者は postMessage メソッドを使用し、受信者は onmessage メソッドを使用してデータを受信します。 postMessage には転送データという 1 つのパラメータしかありません。また、onmessage にも 1 つのパラメータしかありません。イベントの場合、受信データは、event.data を通じて取得されます。
JSON データを送信する
JSON は JS でネイティブにサポートされているものです。複雑なデータを送信するために無駄に JSON を使用する必要はありません。例:

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

postMessage({ 'cmd': 'init', 'timestamp': Date.now()});

エラーの処理
スレッドでエラーが発生すると、その onerrorイベントコールバックが呼び出されます。したがって、エラーを処理する方法は非常に簡単で、スレッド インスタンスの onerror イベントをフックすることです。このコールバック関数にはパラメータ error があり、次の 3 つのフィールドがあります: message - エラー メッセージ; lineno - エラーが発生した行。
スレッドを破棄します
スレッド内で、close メソッドを使用してスレッド自体を破棄します。スレッド外のメインスレッドでは、スレッドインスタンスのterminateメソッドを使用してスレッドを破棄します。
例からスレッドの基本的な操作を見てみましょう:
HTML コード:

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




Web ワーカー fibonacci




fibonacci.js コード:





コードをコピー


コードは次のとおりです:
/ /fibonacci.js var fibonacci = function(n) { return n onmessage = function(event) { var n = parseInt(event.data, 10); postMessage(fibonacci(n));
同じディレクトリに移動してファイル ページを実行し、コンソールを確認すると、操作の結果が表示されます。
ここでもう 1 つ、メイン スレッドで onmessage イベントを別の方法でフックできるということです:





コードをコピー

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


worker.addEventListener('message', function(event) {
console.log("Result:"event.data);
}、 false );

個人的には非常に面倒なのでonmessageを直接使った方が良いと思います。
他のスクリプト ファイルの使用
ワーカー スレッドは、グローバル メソッド importScripts を使用して、他のドメイン内スクリプト ファイルまたはクラス ライブラリをロードして使用できます。たとえば、次のような使用法は合法です:

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

importScripts();/* 何もインポートしません */
importScripts('foo.js'); /* "foo.js" だけをインポートします */
importScripts('foo.js', 'bar .js') ;/* 2 つのスクリプトをインポートします */

インポート後、これらのファイル内のメソッドを直接使用できます。オンラインで小さな例を見てください:

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

/* *
* importScripts メソッドを使用して外部リソース スクリプトを導入します。ここでは数式計算ツール ライブラリ math_utilities.js を使用します。
* JavaScript エンジンがこのリソース ファイルの読み込みを完了したら、次のコードを実行し続けます。同時に、次のコードは、リソース ファイルで定義されている
* 変数とメソッドにアクセスして呼び出すことができます。
**/
importScripts('math_utilities.js');
onmessage = function (event)
{
var first =event.data.first; var Second = events .data.second;
calculate(first,second);
function Calculate(first,second) {
// 計算作業を実行します
var common_divisor= divisor(first, Second);
var common_multiple=multiple(first,second);
postMessage("仕事は終わりました! "
"最小公倍数は " common_divisor
" であり、最大公約数ですis " common_multiple) ;
}


インターネット上の一部のネチズンは、ここで importScripts メソッドを使用して、リソースのプリロードの問題を解決することを考えました (ブラウザは解析や実行を行わずにリソースを事前にロードします)理由も非常に単純です。

スレッドのネスト
ワーカー スレッド内にサブスレッドを作成することもでき、さまざまな操作は変わりません。
同期の問題
ワーカーにはロック メカニズムがなく、マルチスレッドの同期の問題はコード (信号変数の定義など) によってのみ解決できます。
共有 SharedWebWorker
共有 Web ワーカーは、主に複数接続の同時実行の問題に適しています。複数の接続を処理する必要があるため、その API は専用ワーカーの API とは少し異なります。これとは別に、共有 Web ワーカーは専用ワーカーと同様に DOM にアクセスできず、フォーム プロパティへのアクセスも制限されています。共有 Web ワーカーはネットワーク経由で通信することもできません。
ページ スクリプトは共有 Web ワーカーと通信できますが、専用 Web ワーカー (暗黙的なポートを使用して通信する) とは少し異なり、通信はポート オブジェクトを使用して明示的に行われ、これはメッセージ イベント ハンドラーをアタッチすることによって行われます。 。
Web ワーカー スクリプトから最初のメッセージを受信した後、共有 Web ワーカーはアクティブ化されたポートにイベント ハンドラーをアタッチします。通常、ハンドラーは独自の postMessage() メソッドを実行して呼び出しコードにメッセージを返し、その後ポートの start() メソッドが有効なメッセージ プロセスを生成します。
インターネットで見つけることができる唯一の例を見てください。異なる接続から送信された命令を受信するための共有スレッドを作成し、独自の命令処理ロジックを実装します。命令の処理が完了すると、結果がそれぞれの接続に返されます。接続ユーザー。
HTML コード:



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





共有ワーカーの例: HTML5 で共有ワーカーを使用する方法

var worker = new SharedWorker('sharedworker.js');
var log = document.getElementById('response_from_worker');
worker.port.addEventListener('message', function(e) {
//応答データを Web ページに記録します
log.textContent =e.data;
}, false);
worker.port.start();
worker.port.postMessage('ユーザー Web ページからの ping..');
//次のメソッドはユーザー入力を共有ワーカーに送信します
function postMessageToSharedWorker(input)
{
// リクエストを構築するための json オブジェクトを定義します
var命令={instruction:input.value };
worker.port.postMessage(命令);
}




共有ワーカーの例: HTML5 で共有ワーカーを使用する方法

共有ワーカーに指示を送信します:





脚本文件代:

复制代
代码如下:

// 異なる接続から送信された命令を受信するための共有プロセスを構築し、命令処理が完了した後に結果をそれぞれの異なる接続ユーザに返す。
onconnect = function(e) {
connect_number =connect_number 1;
//ここで最初のポートを取得します
var port = e.ports[0];
port.postMessage('新しい接続です! 現在の接続番号は '
connect_number);
port.onmessage = function(e) {
//リクエスターから指示を取得します
var命令=e.data.instruction;
var results=execute_instruction(命令);
port.postMessage('Request: ' 命令 ' 応答 ' 結果
' 共有ワーカーから...');
};
};
/*
* この関数は、リクエスターから送信された命令を実行するために使用されます
* @param 命令
* @return
*/
functionexecute_instruction(instruction)
{
var result_value;
// ここにロジックを実装します
// 命令を実行します...
return result_value;
}


上記の共有スレッドの例では、メイン ページ、つまり各ユーザー接続ページで共有スレッド オブジェクトが構築され、共有スレッドにユーザー指示を送信するメソッド postMessageToSharedWorker が定義されています。同時に、この共有スレッドへの接続の合計数を記録するために、共有スレッド実装コード スニペットで connect_number が定義されます。その後、onconnect イベント ハンドラーを使用して、さまざまなユーザーからの接続を受け入れ、ユーザーから渡された命令を解析します。最後に、ユーザーの命令を実行するメソッドexecute_instructionが定義されています。命令が実行された後、結果が各ユーザーに返されます。

ここでは、前の例のようにワーカー スレッドの onmessage イベント ハンドラーを使用せず、別のメソッド addEventListener を使用します。実際、前述したように、この 2 つの実装原則は基本的に同じですが、共有スレッドからのメッセージを受け入れるために addEventListener を使用する場合は、worker.port.start() メソッドを使用する必要があります。まずこのポートを有効にします。その後はワーカースレッドと同様に通常通りメッセージの送受信ができるようになります。
最後のステートメント
スレッドで実行できること:
1. setTimeout()、clearTimeout()、setInterval()、clearInterval を使用できます。 () などの関数です。
2. ナビゲーターオブジェクトを使用できます。
3. XMLHttpRequest を使用してリクエストを送信できます。
4. Web ストレージはスレッド内で使用できます。
5. スレッド内で self を使用して、このスレッドのスコープを取得できます。
スレッドでできないこと:
1. ナビゲーター以外の DOM/BOM オブジェクト (ウィンドウやドキュメントなど) はスレッドで使用できません (操作したい場合は、メッセージをワーカー作成者に送信し、コールバック関数を介して操作されます)。
2. メインスレッド内の変数や関数はスレッド内で使用できません。
3. アラート等の「停止」効果のある操作コマンドはスレッド内で使用できません。
4. スレッド内のドメインをまたいで JS をロードすることはできません。
スレッドもリソースを消費し、スレッドを使用するとある程度の複雑さが生じるため、追加のスレッドを使用する正当な理由がない場合は使用しないでください。
実用的なリファレンス
公式ドキュメント: http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
WebWorker 分類の説明: http://www.w3schools.com/html5/html5_webworkers.asp
スクリプト ハウス: http://www.jb51.net/w3school/html5/
WebWorker の概要: https://developer.mozilla.org/en/Using_web_workers
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Python+Flaskを使ってWebページのログのリアルタイム更新・表示を実現する方法 Python+Flaskを使ってWebページのログのリアルタイム更新・表示を実現する方法 May 17, 2023 am 11:07 AM

1. module を使用したファイルへのログ出力:logging はカスタム レベルのログを生成し、指定したパスにログを出力できます ログ レベル: debug (デバッグ ログ) = 5) {clearTimeout (time) // すべての結果が取得された場合 10連続した時間が空です スケジュールされたタスクのログをクリアします}return}if(data.log_type==2){//新しいログが取得された場合 for(i=0;i

Nginx Webサーバーキャディの使用方法 Nginx Webサーバーキャディの使用方法 May 30, 2023 pm 12:19 PM

Caddy の概要 Caddy は強力で拡張性の高い Web サーバーであり、現在 Github 上に 38,000 以上のスターが付いています。 Caddy は Go 言語で書かれており、静的リソースのホスティングとリバース プロキシに使用できます。 Caddy には以下の主な特徴があります: Nginx の複雑な構成と比較して、元の Caddyfile 構成は非常にシンプルです; 提供する AdminAPI を通じて構成を動的に変更できます; デフォルトで自動 HTTPS 構成をサポートし、自動的に適用して構成できますHTTPS 証明書; 数万のサイトのデータに拡張可能; 追加の依存関係なしでどこでも実行可能; Go 言語で記述されているため、メモリの安全性がより保証されます。まずはCentOに直接インストールします

ウェブ上の顔面ブロック攻撃に対するリアルタイム保護 (機械学習に基づく) ウェブ上の顔面ブロック攻撃に対するリアルタイム保護 (機械学習に基づく) Jun 10, 2023 pm 01:03 PM

顔面遮蔽弾幕とは、映像内の人物を遮ることなく大量の弾幕が浮遊し、人物の背後から浮遊しているように見せることです。機械学習は数年前から普及していますが、これらの機能がブラウザでも実行できることは多くの人に知られていません。この記事では、ビデオ連発における実際的な最適化プロセスを紹介します。記事の最後に、適用可能なシナリオをいくつか示します。このソリューションを開くことを望んでいます。いくつかのアイデアがあります。 mediapipeDemo (https://google.github.io/mediapipe/) は、顔ブロック弾幕のオンデマンドアップアップロードの主流の実装原理を示していますサーバーのバックグラウンド計算により、ビデオ画面内のポートレート領域を抽出し、SVG ストレージに変換しますクライアントがビデオを再生している間、サーバーから SVG をダウンロードし、弾幕、ポートレートと組み合わせる

FRPS サーバーと Web がポート 80 を共有するように nginx を設定する方法 FRPS サーバーと Web がポート 80 を共有するように nginx を設定する方法 Jun 03, 2023 am 08:19 AM

まず、frpって何?という疑問があると思います。簡単に言うと、frp はイントラネット侵入ツールであり、クライアントを設定すると、サーバー経由でイントラネットにアクセスできるようになります。現在、私のサーバーは Web サイトとして nginx を使用しており、ポート 80 が 1 つだけあります。では、FRP サーバーもポート 80 を使用したい場合はどうすればよいでしょうか?クエリ後、nginx のリバース プロキシを使用してこれを実現できます。追加: frps はサーバー、frpc はクライアントです。ステップ 1: サーバーの nginx.conf 構成ファイルを変更し、次のパラメータを nginx.conf の http{} に追加します。server{listen80

Golang を使用して Web アプリケーションのフォーム検証を実装する方法 Golang を使用して Web アプリケーションのフォーム検証を実装する方法 Jun 24, 2023 am 09:08 AM

フォーム検証は Web アプリケーション開発において非常に重要なリンクであり、フォーム データを送信する前にデータの有効性をチェックして、アプリケーションのセキュリティ脆弱性やデータ エラーを回避できます。 Web アプリケーションのフォーム検証は、Golang を使用すると簡単に実装できます。この記事では、Golang を使用して Web アプリケーションのフォーム検証を実装する方法を紹介します。 1. フォーム検証の基本要素 フォーム検証の実装方法を紹介する前に、フォーム検証の基本要素が何であるかを知る必要があります。フォーム要素: フォーム要素は

Java API開発におけるWebサーバー処理にJetty7を使用する Java API開発におけるWebサーバー処理にJetty7を使用する Jun 18, 2023 am 10:42 AM

JavaAPI 開発における Web サーバー処理に Jetty7 を使用する インターネットの発展に伴い、Web サーバーはアプリケーション開発の中核部分となり、多くの企業でも注目を集めています。増大するビジネス ニーズを満たすために、多くの開発者が Web サーバー開発に Jetty の使用を選択しており、その柔軟性と拡張性は広く認識されています。この記事では、JavaAPI 開発における Jetty7 の使用方法を紹介します。

PHP は Web 開発におけるフロントエンドですか、それともバックエンドですか? PHP は Web 開発におけるフロントエンドですか、それともバックエンドですか? Mar 24, 2024 pm 02:18 PM

PHP は Web 開発のバックエンドに属します。 PHP はサーバー側のスクリプト言語であり、主にサーバー側のロジックを処理し、動的な Web コンテンツを生成するために使用されます。フロントエンド テクノロジーと比較して、PHP はデータベースとの対話、ユーザー リクエストの処理、ページ コンテンツの生成などのバックエンド操作に多く使用されます。次に、特定のコード例を使用して、バックエンド開発における PHP のアプリケーションを説明します。まず、データベースに接続してデータをクエリするための簡単な PHP コード例を見てみましょう。

コックピット Web UI から管理アクセスを有効にする方法 コックピット Web UI から管理アクセスを有効にする方法 Mar 20, 2024 pm 06:56 PM

Cockpit は、Linux サーバー用の Web ベースのグラフィカル インターフェイスです。これは主に、初心者/熟練ユーザーにとって Linux サーバーの管理を容易にすることを目的としています。この記事では、Cockpit アクセス モードと、CockpitWebUI から Cockpit への管理アクセスを切り替える方法について説明します。コンテンツ トピック: コックピット エントリ モード 現在のコックピット アクセス モードの確認 CockpitWebUI からコックピットへの管理アクセスを有効にする CockpitWebUI からコックピットへの管理アクセスを無効にする まとめ コックピット エントリ モード コックピットには 2 つのアクセス モードがあります。 制限付きアクセス: これは、コックピット アクセス モードのデフォルトです。このアクセス モードでは、コックピットから Web ユーザーにアクセスできません。

See all articles