Was ist der Unterschied zwischen synchroner und asynchroner Programmierung (in node.js)
Ich gelesen habe nodebeginner
Und ich kam in den folgenden zwei Stücke von code.
Die erste:
var result = database.query("SELECT * FROM hugetable");
console.log("Hello World");
Den zweiten:
database.query("SELECT * FROM hugetable", function(rows) {
var result = rows;
});
console.log("Hello World");
Ich das bekommen, was Sie tun sollen, Sie die Abfrage der Datenbank und ruft die Antwort auf die Abfrage. Und dann console.log('Hello world')
.
Erste ist eine vermeintlich synchronen code.
Und das zweite ist der asynchrone code.
Den Unterschied zwischen den beiden Stücken ist sehr vage für mich. Was würde der Ausgang sein?
Googeln auf der asynchronen Programmierung nicht zu helfen.
InformationsquelleAutor der Frage Azeirah | 2013-05-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Unterschied ist, dass in der ersten Beispielder Programm-block in der ersten Zeile. Die nächste Zeile (
console.log
) wird warten müssen.In der zweiten Beispieldie
console.log
wird ausgeführt, WÄHREND die Abfrage verarbeitet wird. Das heißt, die Abfrage wird im hintergrund verarbeitet werden, während Ihr Programm auch mit anderen Dingen, und einmal die Abfrage von Daten bereit ist, werden Sie tun, was Sie will.So, in aller Kürze: im ersten Beispiel wird blockiert, während die zweite nicht.
Die Ausgabe der folgenden zwei Beispiele:
Wäre:
Query finished
Next line
Next line
Query finished
Hinweis
Während die Knoten selbst ist single threaded, gibt es einige Aufgaben, die parallel ausgeführt werden können. Zum Beispiel, Operationen im Dateisystem auftreten, in einem anderen Prozess.
Deshalb Knoten tun können asynchrone Operationen: ein thread zu tun Dateisystem-Operationen, während der Haupt-Knoten-Faden hält die Ausführung des javascript-Codes. In einer event-driven-server wie ein Knoten, der Datei-system-thread benachrichtigt, der Haupt-Knoten-thread bestimmter Ereignisse wie Abschluss, scheitern, oder die Fortschritte, zusammen mit allen Daten, die im Zusammenhang mit diesem Ereignis (zum Beispiel das Ergebnis einer Datenbank-Abfrage oder eine Fehlermeldung) und die wichtigsten Knoten thread entscheidet, was zu tun mit diesen Daten.
Können Sie mehr dazu Lesen Sie hier: Wie die single-threaded non-blocking IO-Modell arbeitet in Node.js
InformationsquelleAutor der Antwort Salvatorelab
Den Unterschied zwischen diesen beiden Ansätzen ist wie folgt:
Synchrone Weise:
Es wartet für jeden Vorgang abgeschlossen ist, nach, dass nur er führt die nächste operation.
Für Ihre Abfrage:
Die
console.log()
wird der Befehl nicht ausgeführt werden, bis & es sei denn, die Abfrage beendet ausführen, um alle das Ergebnis aus der Datenbank.Asynchron:
Es wartet nie für jede operation abschließen, sondern es führt alle Operationen in der ersten GEHEN nur. Das Ergebnis jeder operation behandelt wird, sobald das Ergebnis verfügbar ist.
Für Ihre Abfrage:
Die
console.log()
Befehl wird ausgeführt, bald nach derDatabase.Query()
Methode. Während die Datenbank-Abfrage wird im hintergrund ausgeführt und lädt das Ergebnis, sobald es fertig ist, abrufen von Daten.Anwendungsfälle
Wenn Ihr Betriebsablauf nicht tun, ist sehr schwer heben wie das Abfragen großer Datenmengen aus der DB dann gehen Sie vor mit Synchroner Weise anders Asynchrone Weise.
In Asynchroner Weise können Sie zeigen einige Fortschritte-Anzeige, um den Benutzer, während im hintergrund können Sie weiterhin mit Ihrem schweren Gewicht arbeiten. Dies ist ein ideales Szenario für GUI-Anwendungen.
InformationsquelleAutor der Antwort Santosh Panda
Diese ein wenig klarer, wenn Sie fügen Sie eine Zeile zu beiden Beispielen:
Den zweiten:
Versuchen Sie diese und Sie werden bemerken, dass der erste (synchron) Beispiel, das Ergebnis.Länge gedruckt wird, BEVOR die "Hallo Welt" - Linie.
In der zweiten (asynchronen) Beispiel, das Ergebnis.die Länge wird (am wahrscheinlichsten) ausgedruckt werden, wenn das "Hallo Welt" - Linie.
Das ist, weil in dem zweiten Beispiel, das
database.query
ausgeführt wird asynchron im hintergrund, und das Skript endet sofort mit dem "Hallo Welt". Dieconsole.log(result.length)
wird nur ausgeführt, wenn die Datenbank-Abfrage wurde abgeschlossen.InformationsquelleAutor der Antwort Martijn
Erste, ich weiß, ich bin spät, bei der Beantwortung dieser Frage.
Bevor synchron-und Asynchronmotoren, lassen Sie uns kurz betrachten, wie Programme ausgeführt werden.
In der synchrone Fall, jede Anweisung abgeschlossenbevor die nächste Anweisung wird ausgeführt. In diesem Fall wird das Programm ausgewertet wird genau in der Reihenfolge der Anweisungen.
Dies ist, wie asynchrone funktioniert in JavaScript. Es gibt zwei Teile in der JavaScript-engine, ein Teil, sieht auf den code und reiht Operationen und ein weiterer, der die Warteschlange verarbeitet. Die Verarbeitung der queue passiert in einem thread, dass ist der Grund, warum nur eine operation kann passieren, zu einem Zeitpunkt.
Wenn eine asynchrone operation (wie die zweite Datenbank-Abfrage) zu sehen ist, wird der code analysiert wird, und der Betrieb wird in die queue gestellt, aber in diesem Fall wird ein callback registriert, um ausgeführt werden, wenn dieser Vorgang abgeschlossen ist. Die Warteschlange kann viele Operationen haben Sie schon. Die Bedienung an der Vorderseite der Warteschlange werden verarbeitet und aus der Warteschlange entfernt. Sobald der Vorgang für die Datenbank-Abfrage verarbeitet wird, wird die Anfrage an die Datenbank gesendet wird und wenn Sie abgeschlossen wird der callback ausgeführt werden nach Fertigstellung. Zu dieser Zeit, die Warteschlange Prozessor mit "behandelt" die Bedienung bewegt sich auf die nächste operation - in diesem Fall
Die Datenbank-Abfrage wird noch bearbeitet, aber die Konsole.log-Betrieb ist an der front der queue und verarbeitet. Dadurch wird eine synchrone operation wird dann ausgeführt und sofort entstehenden, sofort in die Ausgabe "Hallo Welt". Einige Zeit später, die Datenbank-operation abgeschlossen ist, erst dann wird die callback registriert mit der query aufgerufen wird und verarbeitet werden, setzen den Wert der Variablen Ergebnis zu Reihen.
Ist es möglich, eine asynchrone operation wird eine asynchrone operation, diese zweite operation wird in die Warteschlange und wenn es an der Vorderseite der Warteschlange abgearbeitet werden. Aufruf der callback registriert mit der ein asynchroner Vorgang ist, wie die JavaScript-Laufzeit liefert das Ergebnis der operation, wenn es fertig ist.
Eine einfache Methode, zu wissen, welche JavaScript-operation ist asynchron ist zu beachten, wenn es benötigt eine callback - - callback wird der code ausgeführt werden, wenn der erste Vorgang abgeschlossen ist. In den beiden Beispielen in der Frage, sehen wir nur den zweiten Fall hat ein callback, also es ist der asynchrone Betrieb von den beiden. Es ist nicht immer der Fall, weil die verschiedenen Stile der Handhabung, das Ergebnis einer asynchronen operation.
Um mehr zu erfahren, Lesen Sie die Informationen verspricht. Versprechungen sind eine weitere Möglichkeit, die das Ergebnis einer asynchronen operation behandelt werden können. Die nette Sache über verspricht ist, dass der coding style fühlt sich mehr wie synchroner code.
Viele Bibliotheken, wie Knoten 'fs', bieten sowohl synchrone als auch asynchrone Stile für einige Operationen. In Fällen, wo die operation dauert nicht lange und ist nicht viel benutzt - wie im Fall des Lesens einer config-Datei - die synchron-Stil-Vorgang führen Sie code, der leichter zu Lesen.
InformationsquelleAutor der Antwort Jay
Im synchronen Fall die Konsole.log-Befehl wird erst ausgeführt, wenn die SQL-Abfrage ausführen abgeschlossen hat.
Im asynchronen Fall die Konsole.log-Befehl wird direkt ausgeführt werden. Das Ergebnis der Abfrage wird dann gespeichert werden, indem die "callback" - Funktion irgendwann danach.
InformationsquelleAutor der Antwort related
Der wesentliche Unterschied ist bei der asynchronen Programmierung, die Sie don ' T stop Ausführung sonst. Sie können weiterhin ein anderer code ausgeführt wird, während die "bitte" gemacht wird.
InformationsquelleAutor der Antwort thebreiflabb
Die Funktion macht die zweite asynchron.
Die erste zwingt das Programm warten, bis Sie jede Zeile zu beenden ausgeführt wird, bevor der nächste weitermachen kann. Die zweite erlaubt es, jede Zeile, die zusammen ausgeführt werden (und unabhängig voneinander) auf einmal.
Sprachen und frameworks (js, node.js), die es ermöglichen oder asynchrone Parallelität ist ideal für Dinge, die erfordern Echtzeit-übertragung (zB. chat -, Lager-Anwendungen).
InformationsquelleAutor der Antwort Anton Chan
Sync-Programmierung
Programmiersprachen wie C, C#, Java sind sync-Programmierung, was auch immer Sie schreiben, der ausgeführt wird, um Ihr schreiben.
Async
NodeJs kommt mit async-feature, es ist non-blocking in der Natur, angenommen, in einer I/O-Aufgabe, die sich die Zeit nehmen (abrufen, schreiben, Lesen), nodejs nicht gehalten Leerlauf und warten Sie, bis die Aufgabe zu Ende, es beginne die Ausführung der nächsten Aufgaben in der Warteschlange, und wenn das mal die Aufgabe abgeschlossen, benachrichtigt Sie callback verwenden.
Folgendes Beispiel helfen:
Kurz gesagt, wird die Ausgabe als:
Unterschied ist klar, wo sync wird auf jeden Fall mehr als 600 (500 + 100 + Bearbeitungszeit) msec, async spart Zeit.
InformationsquelleAutor der Antwort Neeraj Bansal