Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Was sind JavaScript-Einzelthreads und Aufgabenwarteschlangen?

Was sind JavaScript-Einzelthreads und Aufgabenwarteschlangen?

王林
王林nach vorne
2023-05-11 22:31:131041Durchsuche

1. Warum ist JavaScript für Single-Threading konzipiert?

Ein Hauptmerkmal der JavaScript-Sprache ist, dass sie Single-Threaded ist. Mit anderen Worten, sie kann jeweils nur eine Sache ausführen.

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

Der obige Code wird erst dann ausgeführt, wenn die for-Schleife ausgeführt wird.

Der einzelne Thread von JavaScript hängt mit seinem Zweck zusammen. Als Browser-Skriptsprache besteht der Hauptzweck von JavaScript darin, mit Benutzern zu interagieren und das DOM zu manipulieren. Dies legt fest, dass es nur Single-Threaded sein kann, da es sonst zu sehr komplexen Synchronisationsproblemen kommt.

Angenommen, JavaScript verfügt über zwei Threads gleichzeitig. Ein Thread fügt einem bestimmten DOM-Knoten Inhalte hinzu und der andere Thread löscht den Knoten. Welchen Thread sollte der Browser in diesem Fall verwenden?

Um Komplexität zu vermeiden, ist JavaScript seit seiner Geburt Single-Threaded. Dies ist zum Kernmerkmal dieser Sprache geworden und wird sich auch in Zukunft nicht ändern.

Um die Rechenleistung von Multi-Core-CPUs zu nutzen, schlägt HTML5 den Web Worker-Standard vor, der es JavaScript-Skripten ermöglicht, mehrere Threads zu erstellen, die untergeordneten Threads werden jedoch vollständig vom Haupt-Thread gesteuert und dürfen das DOM nicht bedienen . Daher ändert dieser neue Standard nichts an der Single-Threaded-Natur von JavaScript.

2. Aufgabenwarteschlange

„Aufgabenwarteschlange“ ist eine Ereigniswarteschlange (kann auch als Nachrichtenwarteschlange verstanden werden). Wenn das E/A-Gerät eine Aufgabe abschließt, wird ein Ereignis zur „Aufgabenwarteschlange“ hinzugefügt, um die zugehörige Asynchronität darzustellen Aufgaben können Sie in den „Ausführungsstapel“ eingeben. Der Hauptthread liest die „Aufgabenwarteschlange“, was bedeutet, dass er liest, welche Ereignisse darin enthalten sind ausgeführt werden, bis die letztgenannte Aufgabe abgeschlossen ist. Wenn die vorherige Aufgabe lange dauert, muss die nächste Aufgabe warten.

Wenn die Warteschlange auf zu viele Berechnungen zurückzuführen ist, ist es verständlich, dass die CPU-Auslastung hoch ist, aber oft ist die CPU im Leerlauf oder es gibt viel ungenutzten Speicherplatz, weil das IO-Gerät (Eingabe- und Ausgabegerät) sehr langsam ist (Zum Beispiel liest die Ajax-Operation Daten aus dem Netzwerk). Sie können nur warten, bis das Ergebnis angezeigt wird, bevor Sie fortfahren.

Die Designer der JavaScript-Sprache haben erkannt, dass der Hauptthread das E/A-Gerät vollständig ignorieren, diese wartenden Aufgaben anhalten und die späteren Aufgaben zuerst ausführen kann. Warten Sie, bis das IO-Gerät das Ergebnis zurückgibt, bevor Sie die anstehende Aufgabe ausführen.

Daher können alle Aufgaben in zwei Typen unterteilt werden: eine ist eine synchrone Aufgabe (synchron) und die andere ist eine asynchrone Aufgabe (asynchron).

Synchronische Aufgaben beziehen sich auf Aufgaben, die zur Ausführung im Hauptthread in die Warteschlange gestellt werden. Die nächste Aufgabe kann erst ausgeführt werden, nachdem die vorherige Aufgabe ausgeführt wurde.

Asynchrone Aufgaben beziehen sich auf Aufgaben, die nicht in den Hauptthread, sondern in die „Aufgabenwarteschlange“ gelangen " (Aufgabenwarteschlange), nur wenn die „Aufgabenwarteschlange“ den Hauptthread benachrichtigt, dass eine asynchrone Aufgabe ausgeführt werden kann, wird die Aufgabe zur Ausführung in den Hauptthread eingegeben.

Im Einzelnen ist der Betriebsmechanismus der asynchronen Ausführung wie folgt. (Dasselbe gilt für die synchrone Ausführung, da sie als asynchrone Ausführung ohne asynchrone Aufgaben betrachtet werden kann.)

Alle synchronen Aufgaben werden im Hauptthread ausgeführt und bilden einen Ausführungsstapel

Neben dem Hauptthread gibt es auch einen „ Aufgabenwarteschlange“ (Aufgabenwarteschlange). Solange die asynchrone Aufgabe laufende Ergebnisse hat, wird ein Ereignis in die „Aufgabenwarteschlange“ gestellt.

Sobald alle Synchronisierungsaufgaben im „Ausführungsstapel“ ausgeführt wurden, liest das System die „Aufgabenwarteschlange“, um zu sehen, welche Ereignisse darin enthalten sind. Diese entsprechenden asynchronen Aufgaben beenden den Wartezustand, betreten den Ausführungsstapel und beginnen mit der Ausführung.

Der Hauptthread führt den dritten Schritt oben wiederholt aus.

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

console.log('end');

//Ergebnis 0 1 2 3 4 Ende Timeout Timeout Timeout Timeout Timeout

Das obige ist der detaillierte Inhalt vonWas sind JavaScript-Einzelthreads und Aufgabenwarteschlangen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen