ホームページ  >  記事  >  ウェブフロントエンド  >  シングルスレッド JS とマルチスレッド ブラウザの使用

シングルスレッド JS とマルチスレッド ブラウザの使用

php中世界最好的语言
php中世界最好的语言オリジナル
2018-03-16 15:17:121646ブラウズ

今回は、シングルスレッド JS とマルチスレッド ブラウザーの使用について説明します。シングルスレッド JS とマルチスレッド ブラウザーを使用する際の 注意事項 は何ですか?実際のケースを見てみましょう。

JS 言語はシングルスレッドです。ブラウザはタスク (関数) を実行するために 1 つのメイン スレッドのみを js に割り当てますが、これらのタスクは一度に 1 つだけ実行でき、タスク キューを形成し、実行のためにキューに入れられます。

ブラウザはマルチスレッドです

ネットワークリクエスト、

タイマー、イベントモニタリングなどの一部のフロントエンドタスクは、他のタスクと同様にキューに入れられて実行を待機している場合、実行効率が低下します。非常に低くなり、ページがフリーズする場合もあります。したがって、ブラウザは Webkit や Gecko エンジンなどのマルチスレッドであり、次のスレッドを持つ可能性があります:

javascriptエンジンスレッド

httpリクエストスレッド

インターフェースレンダリングスレッド

ブラウザイベントトリガースレッド

JS単一スレッドとAjaxは非同期です

JSはシングルスレッドで動作するとのことですが、なぜ接続後はXMLHttpRequestが非同期なのでしょうか?これは、新しいスレッドを開くためにブラウザによって要求されます。リクエストされたステータスが変更されると、コールバックが事前に設定されている場合、非同期スレッドはステータス変更イベントを生成し、それを JavaScript エンジンの

イベント処理キューに入れて処理を待ちます。デキュータスクはブラウザがアイドル状態のときに処理され、JavaScript エンジンは常にシングルスレッドのコールバック関数を実行します。実際、JavaScript エンジンはシングルスレッドのタスク キューであり、通常の関数とコールバック関数で構成されるキューであると理解できます。 つまり、Ajax リクエストは確かに非同期です。これはブラウザによって開かれた新しいスレッド リクエストであり、イベントがコールバックされると、イベント ループのシングルスレッド イベント キューに入れられて処理を待ちます。

JSのイベントループの仕組み(イベントループ)

JavaScriptにはメインスレッドのメインプロセスとコールスタック(コールスタック)があり、コールスタック内のタスクを処理するとき、他のものはすべて待機する必要があります。実行中に setTimeout などの非同期操作が発生すると、setTimeout で指定された遅延実行時間に達すると、それらの操作はブラウザーの他のモジュール (Webkit を例として、Webcore モジュール) に引き渡されて処理されます。 (コールバック関数) がタスクキューに入れられます。一般に、異なる非同期タスクのコールバック関数は異なるタスク キューに配置されます。コールスタック内のすべてのタスクが実行されるまで待ってから、タスクキュー内のタスク(コールバック関数)を実行します。

上の図では、DOM 操作、ajax リクエスト、setTimeout、その他の WebAPI がコール スタックで発生すると、それらは処理のためにブラウザ カーネルの他のモジュールに渡されます。Webkit カーネルには Javasctipt 以外にも重要なモジュールがあります。実行エンジンはWebコアモジュールです。図の WebAPI で示されている 3 つの API について、Webcore は、基礎となる実装を処理するために、それぞれ DOM バインディング、ネットワーク、およびタイマー モジュールを提供します。これらのモジュールがこれらの操作の処理を完了したら、コールバック関数をタスク キューに入れ、スタック内のタスクが実行されるのを待ってから、タスク キュー内のコールバック関数を実行します。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

jsの型変換に関するいくつかのマイナーな問題

JSの暗黙的な型変換

以上がシングルスレッド JS とマルチスレッド ブラウザの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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