Heim > Artikel > Web-Frontend > Analyse der Ereignisschleife in Node
Dieser Artikel stellt Ihnen die Analyse der Ereignisschleife in Node vor. Es hat einen gewissen Referenzwert.
Der Ereignisschleifenprozess von Node.js ist ungefähr wie folgt:
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
Jede Phase hat ihre eigene Aufgabenwarteschlange Diese Phase: Nachdem alle Warteschlangen ausgeführt wurden oder die maximale Anzahl ausgeführter Aufgaben erreicht wurde, geht es in die nächste Phase.
In dieser Phase werden die geplanten Aufgaben ausgeführt, die durch setTimeout
und setInterval
festgelegt wurden.
Natürlich ist dieses Timing nicht genau, aber nach Überschreiten der Timing-Zeit wird es sofort ausgeführt, sobald die Ausführungsmöglichkeit besteht.
In dieser Phase werden einige Vorgänge im Zusammenhang mit dem zugrunde liegenden System ausgeführt, z. B. von TCP-Verbindungen zurückgegebene Fehler usw. Wenn diese Fehler auftreten, werden sie von Node auf den nächsten Zyklus verschoben.
Diese Phase wird verwendet, um Rückrufe im Zusammenhang mit E/A-Vorgängen auszuführen. Der Knoten fragt das Betriebssystem, ob ein neues E/A-Ereignis ausgelöst wurde, und führt dann den entsprechenden Rückruf aus. Fast alle Vorgänge außer den Timer-Ereignissen setImmediate()
und close callbacks
werden in dieser Phase ausgeführt.
In dieser Phase werden die von setImmediate()
festgelegten Aufgaben ausgeführt.
Wenn ein socket
oder handle(句柄)
plötzlich geschlossen wird, beispielsweise über socket.destroy()
, wird in dieser Phase das close
-Ereignis ausgegeben.
Nachdem die Ereignisschleife initialisiert wurde, wird sie gemäß dem in der Abbildung oben gezeigten Prozess fortgesetzt:
Zuerst wird der Timer in Folge von Aufgaben und pending callback
und idle
eingetreten, in denen einige Logik innerhalb des Knotens ausgeführt wird; prepare
Umfragephase ein. Zu diesem Zeitpunkt werden alle E/A-Rückrufe ausgeführt, z. B. das Lesen von Dateien, Netzwerkvorgänge usw. Die poll
-Stufe verfügt über eine poll
-Aufgabenwarteschlange. Der Ausführungsprozess dieser Phase ist wie folgt relativ langwierig: poll queue
Timing-Warteschlange ausführbare Aufgaben enthält . Wenn ja, wird zur Ausführung zu timeout
gesprungen. 定时器阶段
vorhanden ist, wird die 定时器任务
-Aufgabenwarteschlange überprüft. Wenn sie nicht leer ist, werden alle Aufgaben durchlaufen und ausgeführt, bis sie alle ausgeführt werden Die maximale Anzahl ausführbarer Aufgaben ist erreicht. poll queue
Nachdem die Ausführung der Aufgabenwarteschlange abgeschlossen ist, wird geprüft, ob Aufgaben in der Aufgabenwarteschlange poll queue
vorhanden sind. Wenn ja, wird die Ereignisschleife zum nächsten < übergehen 🎜> Bühne. setImmediate
check
setImmediate
: Diese Wartezeit wird nicht ewig andauern, aber nach Erreichen eines Limits fahren Sie mit der nächsten Stufe zur Ausführung fort.
undsetTimeout()
setImmediate()
Ein kleines Geheimnis in
konvertiert. setTimeout(callback, 0)
Weitere Informationen finden Sie hier. Die Ausführungsreihenfolge von setTimeout(callback, 1)
setTimeout()
setImmediate()
Die Ausführungsreihenfolge der folgenden beiden geplanten Aufgaben wird unter verschiedenen Umständen inkonsistent ausgeführt. setTimeout(function() { console.log('timeout'); }, 0); setImmediate(function() { console.log('immediate'); });
Stellen Sie den Timer im normalen Code ein
umgewandelt, sodass beim Eintritt in die setTimeout(callback, 0)
-Phase anhand der aktuellen Zeit beurteilt wird, ob die Der Zeitpunkt wurde setTimeout(callback, 1)
überschritten. 定时器
1ms
zuerst ausgeführt erreicht das Limit von 1ms
, immediate
Die Aufgabe wird zuerst ausgeführt. 1ms
timeout
进入 poll phase
轮询阶段之前会先检查是否有 timer
定时任务。
如果没有 timer
定时任务,才会执行后面的 IO 回调。
我们在 IO 回调中设置 setTimeout
定时任务,这时已经过了 timer
检查阶段,所以 timer
定时任务会被推迟到下一个循环中执行。
process.nextTick()
无论在事件循环的哪个阶段,只要使用 process.nextTick()
添加了回调任务,Node 都会在进入下一阶段之前把 nextTickQueue
队列中的任务执行完。
setTimeout(function() { setImmediate(() => { console.log('immediate'); }); process.nextTick(() => { console.log('nextTick'); }); }, 0); // nextTick // immediate
上述代码中,总是先执行 nextTick
任务,就是因为在循环在进入下一个阶段之前会先执行 nextTickQueue
中的任务。下面代码的执行结果也符合预期。
setImmediate(() => { setTimeout(() => { console.log('timeout'); }, 0); process.nextTick(() => { console.log('nextTick'); }); }); // nextTick // timeout
相关推荐:
Das obige ist der detaillierte Inhalt vonAnalyse der Ereignisschleife in Node. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!