


Raid on HTML5 Javascript API Extension 1—Web Worker の非同期実行と関連する概要_html5 チュートリアルのスキル
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 コード:
fibonacci.js コード:
コードをコピー
コードは次のとおりです:
ここでもう 1 つ、メイン スレッドで onmessage イベントを別の方法でフックできるということです:
コードをコピー
worker.addEventListener('message', function(event) {
console.log("Result:"event.data);
個人的には非常に面倒なので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 コード:
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(命令);
}
共有ワーカーに指示を送信します:
脚本文件代:
// 異なる接続から送信された命令を受信するための共有プロセスを構築し、命令処理が完了した後に結果をそれぞれの異なる接続ユーザに返す。
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

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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