Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine eingehende Analyse der Rückrufwarteschlange von Node.js

青灯夜游
Freigeben: 2020-09-01 10:39:06
nach vorne
1584 Leute haben es durchsucht

Eine eingehende Analyse der Rückrufwarteschlange von Node.js

Queue ist eine wichtige Technologie in Node.js für die effiziente Abwicklung asynchroner Vorgänge. [Video-Tutorial-Empfehlung: node js-Tutorial ]

In diesem Artikel werden wir uns eingehend mit Warteschlangen in Node.js befassen: was sie sind, wie sie funktionieren (über Ereignisschleifen) und ihre Typen.

Was ist eine Warteschlange in Node.js?

Queue ist eine Datenstruktur, die in Node.js zum Organisieren asynchroner Vorgänge verwendet wird. Diese Vorgänge gibt es in verschiedenen Formen, einschließlich HTTP-Anfragen, Lese- oder Schreiboperationen für Dateien, Streams usw.

Die Handhabung asynchroner Vorgänge in Node.js ist eine große Herausforderung.

Abhängig von der Netzwerkqualität kann es bei HTTP-Anfragen zu unvorhersehbaren Verzögerungen (oder, schlimmer noch, zu keinen Ergebnissen) kommen. Auch beim Versuch, Dateien mit Node.js zu lesen und zu schreiben, kann es je nach Größe der Datei zu Verzögerungen kommen.

Ähnlich wie bei Timern und vielen anderen Vorgängen kann auch die Abschlusszeit asynchroner Vorgänge ungewiss sein.

Angesichts dieser unterschiedlichen Latenzszenarien muss Node.js in der Lage sein, alle diese Vorgänge effizient abzuwickeln.

Node.js kann keine Vorgänge verarbeiten, die auf „First-Start-First-Handle“ (First-Start-First-Handle) oder „First-Finish-First-Handle“ (First-Finish-First-Handle) basieren.

Ein Grund, warum dies nicht möglich ist, besteht darin, dass eine asynchrone Operation auch eine andere asynchrone Operation enthalten kann.

Platz für den ersten asynchronen Prozess zu schaffen bedeutet, dass der innere asynchrone Prozess abgeschlossen werden muss, bevor andere asynchrone Vorgänge in der Warteschlange berücksichtigt werden können.

Es gibt viele Situationen, die es zu berücksichtigen gilt. Deshalb ist es am besten, Regeln aufzustellen. Diese Regel beeinflusst die Funktionsweise von Ereignisschleifen und Warteschlangen in Node.js.

Werfen wir einen kurzen Blick darauf, wie Node.js mit asynchronen Vorgängen umgeht.

Aufrufstapel, Ereignisschleife und Rückrufwarteschlange

Der Aufrufstapel wird verwendet, um den Überblick über die aktuell ausgeführte Funktion und den Ort zu behalten, an dem sie ausgeführt wurde. Wenn eine Funktion ausgeführt werden soll, wird sie dem Aufrufstapel hinzugefügt. Dies hilft JavaScript, seine Verarbeitungsschritte nach der Ausführung einer Funktion nachzuvollziehen.

Die Rückrufwarteschlange ist eine Warteschlange, die die Rückruffunktion als asynchrone Operation speichert, wenn die Hintergrundoperation abgeschlossen ist. Sie arbeiten nach dem First-In-First-Out-Prinzip (FIFO). Wir werden später in diesem Artikel verschiedene Arten von Rückrufwarteschlangen vorstellen.

Bitte beachten Sie, dass Node.js für alle asynchronen Aktivitäten verantwortlich ist, da JavaScript seine Single-Threaded-Natur ausnutzen kann, um zu verhindern, dass neue Threads erzeugt werden.

Nach Abschluss des Hintergrundvorgangs ist es auch für das Hinzufügen von Funktionen zur Rückrufwarteschlange verantwortlich. JavaScript selbst hat nichts mit Rückrufwarteschlangen zu tun. Gleichzeitig prüft die Ereignisschleife kontinuierlich, ob der Aufrufstapel leer ist, sodass eine Funktion aus der Rückrufwarteschlange extrahiert und dem Aufrufstapel hinzugefügt werden kann. Die Ereignisschleife überprüft die Warteschlange erst, nachdem alle Synchronisierungsvorgänge durchgeführt wurden.

In welcher Reihenfolge wählt die Ereignisschleife also Rückruffunktionen aus der Warteschlange aus?

Schauen wir uns zunächst die fünf Haupttypen von Rückrufwarteschlangen an.

Arten von Rückrufwarteschlangen

IO-Warteschlange (IO-Warteschlange)

IO-Vorgänge beziehen sich auf Vorgänge mit externen Geräten (z. B. Computerfestplatte, Netzwerkkarte usw.). Zu den allgemeinen Vorgängen gehören das Lesen und Schreiben von Dateivorgängen, Netzwerkvorgänge usw. Diese Vorgänge sollten asynchron sein, da ihre Verarbeitung Node.js überlassen bleibt.

JavaScript kann nicht auf die internen Geräte Ihres Computers zugreifen. Wenn ein solcher Vorgang ausgeführt wird, überträgt JavaScript ihn zur Verarbeitung im Hintergrund an Node.js.

Nach Abschluss werden sie in die E/A-Rückrufwarteschlange übertragen, damit die Ereignisschleife zur Ausführung an den Aufrufstapel übertragen wird.

Timer-Warteschlange

Jeder Vorgang, an dem die Node.js-Timer-Funktion beteiligt ist (z. B. setTimeout() und setInterval()), wird zur Timer-Warteschlange hinzugefügt . setTimeout()setInterval())都是要被添加到计时器队列的。

请注意,JavaScript 语言本身没有计时器功能。它使用 Node.js 提供的计时器 API(包括 setTimeout )执行与时间相关的操作。所以计时器操作是异步的。无论是 2 秒还是 0 秒,JavaScript 都会把与时间相关的操作移交给 Node.js,然后将其完成并添加到计时器队列中。

例如:

setTimeout(function() {
        console.log('setTimeout');
    }, 0)
    console.log('yeah')


# 返回
yeah
setTimeout
Nach dem Login kopieren

在处理异步操作时,JavaScript 会继续执行其他操作。只有在所有同步操作都已被处理完毕后,事件循环才会进入回调队列。

微任务队列(Microtask queue)

该队列分为两个队列:

. Es verwendet die von Node.js bereitgestellte Timer-API (einschließlich setTimeout ), um zeitbezogene Vorgänge auszuführen. Der Timerbetrieb ist also asynchron. Unabhängig davon, ob es sich um 2 Sekunden oder 0 Sekunden handelt, übergibt JavaScript den zeitbezogenen Vorgang an Node.js, das ihn dann abschließt und zur Timer-Warteschlange hinzufügt.

Zum Beispiel: 🎜
let prom = new Promise(function (resolve, reject) {
        // 延迟执行
        setTimeout(function () {
            return resolve("hello");
        }, 2000);
    });
    console.log(prom);
    // Promise { <pending> }
    
    prom.then(function (response) {
        console.log(response);
    });
    // 在 2000ms 之后,输出
    // hello
Nach dem Login kopieren
Nach dem Login kopieren
🎜Während der Verarbeitung eines asynchronen Vorgangs führt JavaScript weiterhin andere Vorgänge aus. Erst nachdem alle Synchronisationsvorgänge verarbeitet wurden, gelangt die Ereignisschleife in die Rückrufwarteschlange. 🎜

Mikrotask-Warteschlange (Microtask-Warteschlange) 🎜🎜Die Warteschlange ist in zwei Warteschlangen unterteilt: 🎜

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!