GOOGLE ADS

Freitag, 22. April 2022

In Node.js werden setImmediate()-Callbacks beim Tick der aktuellen Ereignisschleife oder beim nächsten ausgeführt?

In den offiziellen Dokumenten, Abschnitt "setImmediate() vs. setTimeout()", heißt es: "setImmediate() soll ein Skript ausführen, sobald die aktuelle Umfragephase abgeschlossen ist", und wie ich verstehe, bedeutet dies auch die aktuelle Tick-/Ereignisschleife Kreislauf.

Später im Abschnitt "process.nextTick() vs setImmediate()" heißt es jedoch: "setImmediate() wird bei der folgenden Iteration oder dem 'Tick' der Ereignisschleife ausgelöst".

Also, welche ist die richtige Antwort, habe ich hier etwas verpasst?

Danke im Voraus.

Relevante Seite für Dokumente: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/


Lösung des Problems

Einfache Antwort:

setImmediateläuft beim nächsten Tick.

Einzelheiten:

setImmediateund setTimeoutbeide laufen in unterschiedlichen Phasen auf der Ereignisschleife.

setTimeoutAus diesem Grund wird es nicht sofort ausgeführt, wenn es auf null Verzögerung eingestellt ist. Verwenden Sie setImmediate, die immer beim nächsten Tick der Ereignisschleife ausgeführt werden.

sondern

process.nextTickkümmert sich im Grunde nicht um Phasen der Ereignisschleife. Der Callback, den Sie dieser Methode zuweisen, wird ausgeführt, nachdem die aktuelle Operation abgeschlossen ist und bevor die Ereignisschleife fortgesetzt wird.

Das Dokument, das Sie verlinkt haben, enthält eine sehr gute Erklärung zu den Unterschieden. Ich werde Ihre Aufmerksamkeit hier nur auf einige Punkte lenken. In setimmediate-vs-settimeout ist die Reihenfolge der Aufrufe nicht deterministisch, es sei denn, sie werden innerhalb eines E/A-Zyklus wie im folgenden Beispiel geplant.

Fügen Sie nun das process.nextTickzum Beispiel hinzu

const fs = require('fs');
// I/O cycle
fs.readFile(__filename, () => {
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});
process.nextTick(() => {
console.log('nextTick')
})

Ausgabe:

nextTick
immediate
timeout

Wenn Sie den obigen Code ausführen, wird zuerst ausgeführt, was in process.nextTickFunktion ist. Der Grund dafür ist, dass es ausgeführt wird, bevor die Ereignisschleife fortgesetzt wird. Denken Sie daran, dass sowohl setTimeoutals setImmediateauch ereignisschleifenbezogen sind, aber nicht process.nextTick.

Seien Sie sehr vorsichtig, wie Sie die verwenden process.nextTick. Sie können in schlimme Situationen geraten, wenn Sie es nicht richtig verwenden.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...