Ich habe Nodebeginner gelesen und bin auf die folgenden zwei Codeteile gestoßen .
Der erste:
var result = database.query("SELECT * FROM hugetable");
console.log("Hello World");
Der zweite:
database.query("SELECT * FROM hugetable", function(rows) {
var result = rows;
});
console.log("Hello World");
Ich bekomme, was sie tun sollen, sie fragen die Datenbank ab, um die Antwort auf die Anfrage abzurufen. Und dann console.log('Hello world')
.
Der erste ist angeblich synchroner Code. Und der zweite ist asynchroner Code.
Der Unterschied zwischen den beiden Stücken ist für mich sehr vage. Was wäre die Ausgabe?
Das Googeln über asynchrone Programmierung hat mir auch nicht geholfen.
javascript
node.js
asynchronous
synchronous
Azeirah
quelle
quelle
database.query()
sollte ich sie synchron aufrufen, oder? oder was sollte der Ansatz sein? (Diese Frage habe ich schon lange)Antworten:
Der Unterschied besteht darin, dass im ersten Beispiel das Programm in der ersten Zeile blockiert. Die nächste Zeile (
console.log
) muss warten.Im zweiten Beispiel
console.log
wird das ausgeführt , während die Abfrage verarbeitet wird. Das heißt, die Abfrage wird im Hintergrund verarbeitet, während Ihr Programm andere Aufgaben ausführt. Sobald die Abfragedaten fertig sind, können Sie damit tun, was Sie wollen.Kurz gesagt: Das erste Beispiel wird blockieren, das zweite nicht.
Die Ausgabe der folgenden zwei Beispiele:
Wäre:
Query finished
Next line
Next line
Query finished
Hinweis
Während der Knoten selbst Single-Threaded ist , gibt es einige Aufgaben, die parallel ausgeführt werden können. Beispielsweise treten Dateisystemvorgänge in einem anderen Prozess auf.
Aus diesem Grund kann Node asynchrone Operationen ausführen: Ein Thread führt Dateisystemoperationen aus, während der Hauptknotenthread weiterhin Ihren Javascript-Code ausführt. In einem ereignisgesteuerten Server wie Node benachrichtigt der Dateisystem-Thread den Hauptknotenthread über bestimmte Ereignisse wie Abschluss, Fehler oder Fortschritt sowie über alle mit diesem Ereignis verbundenen Daten (z. B. das Ergebnis einer Datenbankabfrage oder eines Fehlers) message) und der Hauptknotenthread entscheidet, was mit diesen Daten geschehen soll.
Weitere Informationen hierzu finden Sie hier: Funktionsweise des nicht blockierenden E / A-Modells mit einem Thread in Node.js.
quelle
request query.; 5 seconds later when the request is done; console.log
; wenn der zweite ausgeführt wird :request query; console.log; work on the query
;database.query
endet so schnell, dassconsole.log
die Aufgabe bereits erledigt ist, wenn wir sie erreichen .console.log("Next line");
in Beispiel 2 die anonyme Funktion befindet,console.log("query finished");
würde dies bedeuten, dass "Nächste Zeile" NACH "Abfrage beendet" gedruckt wird, oder? Wenn ich also alles verschachtelt habe, läuft alles synchron, sodass ich mir keine Gedanken über die Verwendung synchroner Versionen bestimmter Funktionen machen muss. Bin ich in meinem Verständnis richtig?Der Unterschied zwischen diesen beiden Ansätzen ist wie folgt:
Synchroner Weg: Es wartet, bis jeder Vorgang abgeschlossen ist, danach führt nur der nächste Vorgang aus. Für Ihre Abfrage: Der
console.log()
Befehl wird erst ausgeführt, wenn & die Ausführung der Abfrage abgeschlossen ist, um das gesamte Ergebnis aus der Datenbank abzurufen.Asynchroner Weg: Es wartet nie auf den Abschluss jeder Operation, sondern führt alle Operationen nur im ersten GO aus. Das Ergebnis jeder Operation wird verarbeitet, sobald das Ergebnis verfügbar ist. Für Ihre Anfrage: Der
console.log()
Befehl wird kurz nach derDatabase.Query()
Methode ausgeführt. Während die Datenbankabfrage im Hintergrund ausgeführt wird und das Ergebnis lädt, sobald der Abruf der Daten abgeschlossen ist.Anwendungsfälle
Wenn Ihre Vorgänge nicht sehr schwer sind, wie das Abfragen großer Datenmengen aus der Datenbank, fahren Sie mit der synchronen Methode fort, andernfalls mit der asynchronen Methode.
Auf asynchrone Weise können Sie dem Benutzer eine Fortschrittsanzeige anzeigen, während Sie im Hintergrund mit Ihren schweren Arbeiten fortfahren können. Dies ist ein ideales Szenario für GUI-Apps.
quelle
console.log
?Dies wird etwas deutlicher, wenn Sie beiden Beispielen eine Zeile hinzufügen:
Der zweite:
Wenn Sie diese ausführen, werden Sie feststellen, dass das erste (synchrone) Beispiel, die result.length, VOR der Zeile "Hello World" ausgedruckt wird. Im zweiten (asynchronen) Beispiel wird die result.length (höchstwahrscheinlich) NACH der Zeile "Hello World" gedruckt.
Das liegt daran, dass im zweiten Beispiel das
database.query
asynchron im Hintergrund ausgeführt wird und das Skript sofort mit der "Hallo Welt" fortgesetzt wird. Dasconsole.log(result.length)
wird nur ausgeführt, wenn die Datenbankabfrage abgeschlossen ist.quelle
Zuerst stelle ich fest, dass ich diese Frage zu spät beantworte.
Bevor wir uns mit synchron und asynchron befassen, wollen wir uns kurz ansehen, wie Programme ausgeführt werden.
Im synchronen Fall wird jede Anweisung abgeschlossen, bevor die nächste Anweisung ausgeführt wird. In diesem Fall wird das Programm genau in der Reihenfolge der Anweisungen ausgewertet.
So funktioniert Asynchron in JavaScript. Die JavaScript-Engine besteht aus zwei Teilen, einem Teil, der sich mit den Code- und Warteschlangenoperationen befasst, und einem anderen Teil, der die Warteschlange verarbeitet. Die Warteschlangenverarbeitung erfolgt in einem Thread. Daher kann jeweils nur eine Operation ausgeführt werden.
Wenn eine asynchrone Operation (wie die zweite Datenbankabfrage) angezeigt wird, wird der Code analysiert und die Operation in die Warteschlange gestellt. In diesem Fall wird jedoch ein Rückruf registriert, der ausgeführt werden soll, wenn diese Operation abgeschlossen ist. Die Warteschlange enthält möglicherweise bereits viele Vorgänge. Der Vorgang an der Vorderseite der Warteschlange wird verarbeitet und aus der Warteschlange entfernt. Sobald der Vorgang für die Datenbankabfrage verarbeitet wurde, wird die Anforderung an die Datenbank gesendet, und wenn der Rückruf abgeschlossen ist, wird er nach Abschluss ausgeführt. Zu diesem Zeitpunkt bewegt sich der Warteschlangenprozessor, der die Operation "behandelt" hat, zur nächsten Operation - in diesem Fall
Die Datenbankabfrage wird noch verarbeitet, aber die Operation console.log befindet sich vorne in der Warteschlange und wird verarbeitet. Dies ist eine synchrone Operation, die sofort ausgeführt wird und sofort zur Ausgabe "Hello World" führt. Einige Zeit später wird der Datenbankvorgang abgeschlossen. Erst dann wird der bei der Abfrage registrierte Rückruf aufgerufen und verarbeitet, wobei der Wert des Variablenergebnisses auf Zeilen gesetzt wird.
Es ist möglich, dass eine asynchrone Operation zu einer anderen asynchronen Operation führt. Diese zweite Operation wird in die Warteschlange gestellt und an der Vorderseite der Warteschlange verarbeitet. Durch Aufrufen des bei einer asynchronen Operation registrierten Rückrufs gibt die JavaScript-Laufzeit das Ergebnis der Operation zurück, wenn sie abgeschlossen ist.
Eine einfache Methode, um zu wissen, welche JavaScript-Operation asynchron ist, besteht darin, festzustellen, ob ein Rückruf erforderlich ist. Der Rückruf ist der Code, der ausgeführt wird, wenn die erste Operation abgeschlossen ist. In den beiden Beispielen in der Frage können wir sehen, dass nur der zweite Fall einen Rückruf hat, also ist es die asynchrone Operation der beiden. Dies ist aufgrund der unterschiedlichen Arten der Behandlung des Ergebnisses einer asynchronen Operation nicht immer der Fall.
Um mehr zu erfahren, lesen Sie über Versprechen. Versprechen sind eine weitere Möglichkeit, mit dem Ergebnis einer asynchronen Operation umzugehen. Das Schöne an Versprechungen ist, dass sich der Codierungsstil eher wie synchroner Code anfühlt.
Viele Bibliotheken wie der Knoten 'fs' bieten für einige Operationen sowohl synchrone als auch asynchrone Stile. In Fällen, in denen die Operation nicht lange dauert und nicht häufig verwendet wird - wie beim Lesen einer Konfigurationsdatei - führt die Operation im synchronen Stil zu Code, der leichter zu lesen ist.
quelle
Im synchronen Fall wird der Befehl console.log erst ausgeführt, wenn die Ausführung der SQL-Abfrage abgeschlossen ist.
Im asynchronen Fall wird der Befehl console.log direkt ausgeführt. Das Ergebnis der Abfrage wird dann einige Zeit später von der "Rückruf" -Funktion gespeichert.
quelle
Der Hauptunterschied besteht in der asynchronen Programmierung. Andernfalls beenden Sie die Ausführung nicht. Sie können weiterhin anderen Code ausführen, während die 'Anfrage' gestellt wird.
quelle
Die Funktion macht die zweite asynchron.
Der erste zwingt das Programm, zu warten, bis jede Zeile beendet ist, bevor die nächste fortgesetzt werden kann. Mit der zweiten Zeile kann jede Zeile gleichzeitig (und unabhängig) ausgeführt werden.
Sprachen und Frameworks (js, node.js), die Asynchronität oder Parallelität ermöglichen, eignen sich hervorragend für Dinge, die eine Echtzeitübertragung erfordern (z. B. Chat, Aktienanwendungen).
quelle
Programmierung synchronisieren
Programmiersprachen wie C, C #, Java sind Synchronisierungsprogramme. Was auch immer Sie schreiben, wird in der Reihenfolge Ihres Schreibens ausgeführt.
Async
NodeJs bietet eine asynchrone Funktion, die nicht blockierend ist. Angenommen, bei jeder E / A-Aufgabe, die Zeit in Anspruch nimmt (Abrufen, Schreiben, Lesen), werden NodeJs nicht im Leerlauf gehalten und warten, bis die Aufgabe abgeschlossen ist. Ich beginne mit der Ausführung der nächsten Aufgaben in der Warteschlange. Sobald diese Aufgabe erledigt ist, wird dies per Rückruf benachrichtigt. Das folgende Beispiel hilft:
Kurz gesagt, die Ausgabe lautet wie folgt:
Der Unterschied ist klar, wo die Synchronisierung definitiv mehr als 600 (500 + 100 + Verarbeitungszeit) ms dauert. Asynchrone spart Zeit.
quelle
Synchrone Funktionen blockieren, asynchrone Funktionen nicht. In synchronen Funktionen werden Anweisungen abgeschlossen, bevor die nächste Anweisung ausgeführt wird. In diesem Fall wird das Programm genau in der Reihenfolge der Anweisungen ausgewertet und die Ausführung des Programms wird angehalten, wenn eine der Anweisungen sehr lange dauert.
Asynchrone Funktionen akzeptieren normalerweise einen Rückruf als Parameter und die Ausführung wird in der nächsten Zeile unmittelbar nach dem Aufrufen der asynchronen Funktion fortgesetzt. Der Rückruf wird nur aufgerufen, wenn der asynchrone Vorgang abgeschlossen ist und der Aufrufstapel leer ist. Hochleistungsvorgänge wie das Laden von Daten von einem Webserver oder das Abfragen einer Datenbank sollten asynchron ausgeführt werden, damit der Hauptthread weiterhin andere Vorgänge ausführen kann, anstatt zu blockieren, bis dieser lange Vorgang abgeschlossen ist (im Fall von Browsern friert die Benutzeroberfläche ein). .
Orginal Gepostet auf Github: Link
quelle
Asynchrone Programmierung in JS:
Synchron
Asynchron
Beispiel:
quelle