


Was ist eine Ereignisschleife? Detaillierte Erläuterung der Ereignisschleife in Node.js
Was ist die Ereignisschleife? Dieser Artikel stellt Ihnen die Ereignisschleife in Node vor, ich hoffe, er wird Ihnen hilfreich sein!
Was ist eine Ereignisschleife?
Obwohl JavaScript Single-Threaded ist, nutzt die Ereignisschleife den Systemkern so weit wie möglich, sodass Node.js nicht blockierende E/A-Vorgänge ausführen kann Obwohl die meisten modernen Kernel Multi-Thread-fähig sind, können sie Multi-Thread-Aufgaben im Hintergrund verarbeiten. Wenn eine Aufgabe abgeschlossen ist, teilt der Kernel Node.js mit, und dann wird der entsprechende Rückruf zur Ausführung hinzugefügt. In diesem Artikel wird dieses Thema ausführlicher vorgestellt
Erklärung der Zeitschleife
Wenn Node. js startet Bei der Ausführung wird zunächst die Ereignisschleife initialisiert, das bereitgestellte Eingabeskript wird verarbeitet (oder in die REPL eingefügt, was in diesem Dokument nicht behandelt wird). Dadurch wird ein asynchroner API-Aufruf ausgeführt, ein Timer geplant oder aufgerufen Process.nextTick(), und beginnen Sie dann mit der Verarbeitung der Ereignisschleife
Die Abbildung unten zeigt eine vereinfachte Übersicht über die Ausführungssequenz der Ereignisschleife
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
Jedes Feld stellt eine Stufe der Ereignisschleife dar
Jede Stufe verfügt über eine FIFO-Warteschlange Rückrufausführung, jedoch wird jede Stufe auf ihre eigene Weise ausgeführt. Wenn die Ereignisschleife in eine Stufe eintritt, führt sie im Allgemeinen alle Vorgänge in der aktuellen Stufe aus und beginnt mit der Ausführung von Rückrufen in der Warteschlange der aktuellen Stufe, bis die Warteschlange vollständig belegt ist oder die Die maximale Datenmenge in der Warteschlange ist erreicht. Wenn die Warteschlange erschöpft ist oder ihre maximale Größe erreicht, geht die Ereignisschleife zur nächsten Stufe über.
Phasenübersicht
- Timer In dieser Phase werden setTimeout()- und setInterval()-Rückrufe ausgeführt Wird nur intern verwendet
- poll , um neue E/A-Ereignisse abzurufen; E/A-bezogene Rückrufe ausführen (fast alle zugehörigen Rückrufe, Rückrufe schließen)
- check setImmediate() wird zu diesem Zeitpunkt aufgerufen
- Rückrufe schließen Rückrufe schließen, zum Beispiel: socket.on('close', ...)
- In jedem Prozess der Ereignisschleife prüft Node.js, ob es auf asynchrone E/A und Timer wartet. Wenn nicht Dann vollständig schließen.
- Phasendetails time Führt so früh wie möglich nach der Zeit aus, die Betriebssystemplanung oder andere Rückrufe verzögern jedoch die Ausführung.
ausstehende Rückrufe
In dieser Phase werden Rückrufe für bestimmte Systemvorgänge (z. B. TCP-Fehlertypen) ausgeführt. Einige *nix-Systeme möchten beispielsweise darauf warten, dass ein Fehler gemeldet wird, wenn ein TCP-Socket beim Versuch, eine Verbindung herzustellen, ECONNREFUSED empfängt. Dies wird während der ausstehenden Rückrufphase zur Ausführung in die Warteschlange gestellt.Poll
Poll-Phase hat zwei Hauptfunktionen:Berechnen Sie die E/A-Blockierungszeit Es passieren zwei Dinge: Wenn die Umfragewarteschlange nicht leer ist, iteriert die Ereignisschleife und führt jeden Rückruf synchron aus, bis alle ausgeführt werden oder das harte Limit des Systems erreicht ist. Wenn die Umfragewarteschlange leer ist, treten die folgenden beiden Situationen auf passieren
Wenn es sich um einen setImmediate-Rückruf handelt, beendet die Ereignisschleife die Abfragephase und tritt in die Prüfphase ein, um den Rückruf auszuführen
Wenn es nicht gesetztImmediate ist, wartet die Ereignisschleife darauf, dass der Rückruf zur Warteschlange hinzugefügt wird. und dann sofort ausführen
Sobald die Abfragewarteschlange leer ist, erkennt die Ereignisschleife, ob der Timer abgelaufen ist. Wenn ja, erreicht die Ereignisschleife die Timer-Stufe und führt den Timer-Rückruf aus
check
此阶段允许人们在 poll 阶段完成后立即执行回调。 如果轮询阶段变得空闲并且脚本已使用 setImmediate() 排队,则事件循环可能会继续到 check 阶段而不是等待。
setImmediate() 实际上是一个特殊的计时器,它在事件循环的单独阶段运行。 它使用一个 libuv API 来安排在 poll 阶段完成后执行的回调。
通常,随着代码的执行,事件循环最终会到达 poll 阶段,它将等待传入的连接、请求等。但是,如果使用 setImmediate() 安排了回调并且 poll 阶段变得空闲,它将结束并继续 check 阶段,而不是等待 poll 事件。
close callbacks
如果一个 socket 或者操作突然被关闭(e.g socket.destroy()),close 事件会被发送到这个阶段,否则会通过process.nextTick()发送
setImmediate() VS setTimeout()
setImmediate() 和 setTimeout() 是相似的,但是不同的行为取决于在什么时候被调用
- setTimmediate() 在 poll 阶段一旦执行完就会执行
- setTimeout() 在一小段时间过去之后被执行
每个回调执行的顺序依赖他们被调用的上下本环境,如果在同一个模块被同时调用,那么时间会受到进程性能的限制(这也会被运行在这台机器的其他应用所影响)
例如,如果我们不在I/O里边运行下面的脚本,尽管它受进程性能的影响,但是不能够确定这两个计时器的执行顺序:
// timeout_vs_immediate.js setTimeout(() => { console.log('timeout'); }, 0); setImmediate(() => { console.log('immediate'); });
$ node timeout_vs_immediate.js timeout immediate $ node timeout_vs_immediate.js immediate timeout
然而,如果你移动到I/O 循环中,immediate 回调总是会先执行
// timeout_vs_immediate.js const fs = require('fs'); fs.readFile(__filename, () => { setTimeout(() => { console.log('timeout'); }, 0); setImmediate(() => { console.log('immediate'); }); });
$ node timeout_vs_immediate.js immediate timeout $ node timeout_vs_immediate.js immediate timeout
setImmediate 相对于 setTimeout 的优势是 setImmediate 如果在I/O 中总是会优先于任何计时器被先执行,与存在多少计时器无关。
process.nextTick()
尽管 process.nextTick() 是异步API的一部分,但是你可能已经注意到了它没有出现在图表中,这是因为 process.nextTick() 不是事件循环技术的一部分,相反,当前操作执行完毕之后 nextTickQueue 会被执行,无论事件循环的当前阶段如何。 在这里,操作被定义为来自底层 C/C++ 处理程序的转换,并处理需要执行的 JavaScript。 根据图表,你可以在任意阶段调用 process.nextTick(),在事件循环继续执行之前,所有传递给 process.nextTick() 的回调都将被执行,这个会导致一些坏的情况因为它允许你递归调用 process.nextTick() "starve" 你的 I/O ,这会阻止事件循环进入 poll 阶段。
为什么这会被允许
为什么这种情况会被包含在Node.js中?因为Node.js的设计理念是一个API应该总是异步的即使它不必须,看看下面的片段
function apiCall(arg, callback) { if (typeof arg !== 'string') return process.nextTick( callback, new TypeError('argument should be string') ); }
该片段会进行参数检查,如果不正确,它会将错误传递给回调。 API 最近更新,允许将参数传递给 process.nextTick() 允许它接受在回调之后传递的任何参数作为回调的参数传播,因此您不必嵌套函数。
我们正在做的是将错误传回给用户,但前提是我们允许用户的其余代码执行。 通过使用 process.nextTick(),我们保证 apiCall() 总是在用户代码的其余部分之后和允许事件循环继续之前运行它的回调。 为了实现这一点,允许 JS 调用堆栈展开,然后立即执行提供的回调,这允许人们对 process.nextTick() 进行递归调用,而不会达到 RangeError:从 v8 开始超出最大调用堆栈大小。
更多node相关知识,请访问:nodejs 教程!
Das obige ist der detaillierte Inhalt vonWas ist eine Ereignisschleife? Detaillierte Erläuterung der Ereignisschleife in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Speichers und Garbage Collectors (GC) der NodeJS V8-Engine. Ich hoffe, er wird Ihnen hilfreich sein!

Der nicht blockierende und ereignisgesteuerte Knotendienst hat den Vorteil eines geringen Speicherverbrauchs und eignet sich sehr gut für die Verarbeitung massiver Netzwerkanforderungen. Unter der Voraussetzung massiver Anfragen müssen Probleme im Zusammenhang mit der „Speicherkontrolle“ berücksichtigt werden. 1. Der Garbage-Collection-Mechanismus und die Speicherbeschränkungen von V8 Js wird von der Garbage-Collection-Maschine gesteuert

Die Auswahl eines Docker-Images für Node mag trivial erscheinen, aber die Größe und potenziellen Schwachstellen des Images können erhebliche Auswirkungen auf Ihren CI/CD-Prozess und Ihre Sicherheit haben. Wie wählen wir also das beste Node.js-Docker-Image aus?

Node 19 wurde offiziell veröffentlicht. Dieser Artikel wird Ihnen eine detaillierte Erklärung der 6 Hauptfunktionen von Node.js 19 geben. Ich hoffe, er wird Ihnen hilfreich sein!

Das Dateimodul ist eine Kapselung der zugrunde liegenden Dateioperationen, wie z. B. Lesen/Schreiben/Öffnen/Schließen/Löschen von Dateien, Hinzufügen usw. Das größte Merkmal des Dateimoduls besteht darin, dass alle Methoden zwei Versionen von **synchronem** und **bereitstellen. asynchron**, mit Methoden mit dem Suffix sync sind alle Synchronisationsmethoden, und diejenigen ohne sind alle heterogene Methoden.

Wie führt Node.js GC (Garbage Collection) durch? Der folgende Artikel führt Sie durch.

Die Ereignisschleife ist ein grundlegender Bestandteil von Node.js und ermöglicht die asynchrone Programmierung, indem sie sicherstellt, dass der Hauptthread nicht blockiert wird. Das Verständnis der Ereignisschleife ist für die Erstellung effizienter Anwendungen von entscheidender Bedeutung. Der folgende Artikel wird Ihnen ein detailliertes Verständnis der Ereignisschleife in Node vermitteln. Ich hoffe, er wird Ihnen hilfreich sein!

Zu Beginn lief JS nur auf der Browserseite. Es war einfach, Unicode-codierte Zeichenfolgen zu verarbeiten, aber es war schwierig, binäre und nicht Unicode-codierte Zeichenfolgen zu verarbeiten. Und Binär ist das Datenformat der niedrigsten Ebene des Computer-, Video-/Audio-/Programm-/Netzwerkpakets
