385 Stimmen

SetImmediate vs. nextTick

Die Version 0.10 von Node.js wurde heute veröffentlicht und führte setImmediate ein. Die API-Änderungen Dokumentation schlägt vor, es bei rekursiven nextTick Aufrufen zu verwenden.

Laut dem, was MDN sagt, scheint es sehr ähnlich zu process.nextTick zu sein.

Wann sollte ich nextTick und wann sollte ich setImmediate verwenden?

11voto

GingerBeer Punkte 790

Im einfachen Sinne wird process.NextTick() beim nächsten Tick der Ereignisschleife ausgeführt. Allerdings hat setImmediate im Grunde eine separate Phase, die sicherstellt, dass der unter setImmediate() registrierte Callback nur nach dem IO-Callback und der Abfragephase aufgerufen wird.

Bitte beachten Sie diesen Link für eine gute Erklärung: https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c

vereinfachte Ereignisschleifenereignisse

4voto

Valikhan Akhmedov Punkte 951

Ich empfehle Ihnen, den Dokumente Abschnitt über Loop zu überprüfen, um ein besseres Verständnis zu erhalten. Einige Auszüge aus diesem Abschnitt:

Wir haben zwei Aufrufe, die aus Sicht der Benutzer ähnlich sind, aber ihre Namen sind verwirrend.

  • process.nextTick() wird sofort in derselben Phase ausgelöst

  • setImmediate() wird in der nächsten Iteration oder 'Tick' der
    Ereignisschleife ausgelöst

Im Wesentlichen sollten die Namen vertauscht werden. process.nextTick() wird schneller ausgelöst als setImmediate(), aber dies ist ein Überbleibsel aus der Vergangenheit, das sich wahrscheinlich nicht ändern wird.

2voto

呂學洲 Punkte 944

Sie sollten niemals eine CPU-intensive Operation mit process.nextTick() unterbrechen

Sie sollten niemals eine solche Arbeit mit process.nextTick() unterbrechen. Wenn Sie dies tun, führt dies zu einer Mikroaufgabenwarteschlange, die nie leer wird - Ihre Anwendung wird für immer in derselben Phase feststecken! -- Thomas Hunter. Verteilte Systeme mit Node.js

Jede Phase der Ereignisschleife enthält mehrere Rückrufe:

Eine Phase der Ereignisschleife

Sobald process.nextTick() ausgelöst wird, bleibt es immer in derselben Phase.

Beispiel

const nt_recursive = () => process.nextTick(nt_recursive);
nt_recursive(); // setInterval wird niemals ausgeführt

const si_recursive = () => setImmediate(si_recursive);
si_recursive(); // setInterval wird ausgeführt

setInterval(() => console.log('Hallo'), 10);

In diesem Beispiel repräsentiert das setInterval() einige asynchrone Arbeiten, die die Anwendung ausführt, wie z.B. auf ankommende HTTP-Anfragen zu reagieren.

Wenn die Funktion nt_recursive() ausgeführt wird, landet die Anwendung in einer Mikroaufgabenwarteschlange, die nie leer wird, und die asynchronen Arbeiten werden nie verarbeitet.

Aber die alternative Version si_recursive() hat nicht den gleichen Seiteneffekt.

Das Hinzufügen von setImmediate()-Aufrufen innerhalb einer Überprüfungsphase fügt Rückrufe zur Warteschlange der Überprüfungsphase der nächsten Ereignisschleifeniteration hinzu, nicht zur Warteschlange der aktuellen Phase.

Fall könnte process.nextTick verwenden

Lassen Sie die Funktion alle asynchron verarbeiten.

function foo(count, callback) {
  if (count <= 0) {
    return process.nextTick(() => callback(new TypeError('count > 0')));
  }
  myAsyncOperation(count, callback);
}

-- Thomas Hunter. Verteilte Systeme mit Node.js

In diesem Fall ist es in Ordnung, entweder setImmediate() oder process.nextTick() zu verwenden; stellen Sie nur sicher, dass Sie versehentlich keine Rekursion einführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X