ホームページ  >  記事  >  運用・保守  >  JavaScript のシングル スレッドとタスク キューとは何ですか?

JavaScript のシングル スレッドとタスク キューとは何ですか?

王林
王林転載
2023-05-11 22:31:131043ブラウズ

1. JavaScript はなぜシングルスレッドで設計されているのですか?

JavaScript 言語の主な特徴は、シングルスレッドであること、つまり一度に 1 つのことしか実行できないことです。

for(var j = 0; j < 5; j++) {
 console.log(j);
}
console.log('end');

上記のコードは、for ループが実行されるまで実行されません;

JavaScript の単一スレッドは、その目的に関連しています。ブラウザーのスクリプト言語としての JavaScript の主な目的は、ユーザーと対話して DOM を操作することです。これにより、シングルスレッドのみが可能であることが決まります。そうでない場合は、非常に複雑な同期の問題が発生します。

JavaScript に同時に 2 つのスレッドがあるとします。1 つのスレッドは特定の DOM ノードにコンテンツを追加し、もう 1 つのスレッドはノードを削除します。この場合、ブラウザはどちらのスレッドを使用する必要がありますか?

つまり、複雑さを避けるために、JavaScript は誕生以来シングルスレッドであり、これがこの言語の中核機能となっており、今後も変わることはありません。

マルチコア CPU のコンピューティング能力を活用するために、HTML5 は Web Worker 標準を提案しています。これにより、JavaScript スクリプトは複数のスレッドを作成できますが、子スレッドはメインスレッドによって完全に制御されるため、 DOM を操作しないでください。したがって、この新しい標準は JavaScript のシングルスレッドの性質を変更しません。

2. タスク キュー

「タスク キュー」はイベント キュー (メッセージ キューとしても理解できます) であり、IO デバイスがタスクを完了すると、「タスク キュー」に追加されます。 「キュー」 関連する非同期タスクが「実行スタック」に入ることができることを示すイベント。メインスレッドは「タスクキュー」を読み取ります。これは、その中のイベントを読み取ることを意味します;

説明しましょう:

Javascript はシングルスレッドであり、シングルスレッドとは、すべてのタスクが前のタスクが完了するまで、次のタスクは実行されません。前のタスクに時間がかかると、次のタスクも待たされることになります。

キューが計算過多によるものである場合、CPU 使用率が高いことは理解できますが、多くの場合、CPU がアイドル状態であるか、使用されていない大きな領域が存在します。これは、IO デバイス (入力) が原因で発生します。および出力デバイス) ) は非常に遅く (たとえば、Ajax 操作はネットワークからデータを読み取ります)、結果が出力されるまで待機した後でのみ実行を続行できます。

JavaScript 言語の設計者は、メインスレッドが IO デバイスを完全に無視し、これらの待機中のタスクを一時停止して、後のタスクを最初に実行できることに気づきました。 IO デバイスが結果を返すまで待ってから、保留中のタスクを実行します。

したがって、すべてのタスクは、同期タスク (synchronous) と非同期タスク (asynchronous) の 2 つのタイプに分類できます。

同期タスクは、メイン スレッドで実行するためにキューに入れられたタスクを指します。次のタスクは、前のタスクが実行された後にのみ実行できます。

非同期タスクは、メイン スレッドに入ることができないタスクを指します。 「タスクキュー」に入ったタスクは、「タスクキュー」がメインスレッドに非同期タスクの実行が可能であることを通知した場合にのみ、タスクはメインスレッドに入って実行されます。

具体的には、非同期実行の動作仕組みは以下のとおりです。 (同期実行についても同様です。非同期タスクがなければ非同期実行とみなされるためです。)

すべての同期タスクはメインスレッドで実行され、実行スタックを形成します。

メインスレッドの他に「タスクキュー」もあります。非同期タスクに実行結果がある限り、イベントは「タスク キュー」に配置されます。

「実行スタック」内のすべての同期タスクが実行されると、システムは「タスク キュー」を読み取り、その中にどのようなイベントがあるかを確認します。これらの対応する非同期タスクは待機状態を終了し、実行スタックに入り、実行を開始します。

メインスレッドは上記の 3 番目のステップを繰り返し実行します。

for(var j = 0; j < 5; j++) {
  console.log(j);
  setTimeout(function() {
    console.log('timeout');
  }, 0);
}

console.log('end');

//結果 0 1 2 3 4 終了タイムアウト タイムアウト タイムアウト タイムアウト タイムアウト

以上がJavaScript のシングル スレッドとタスク キューとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。