it-swarm.com.de

Was ist der Unterschied zwischen synchroner und asynchroner Programmierung (in node.js)

Ich habe gelesen NodeBeginner Und ich 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 Abfrage 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 auf asynchrone Programmierung hat mir auch nicht geholfen.

179
Azeirah

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 wird das console.log wird 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, und sobald die Abfragedaten bereit sind, können Sie damit nach Belieben vorgehen.

Kurz gesagt: Das erste Beispiel wird blockieren, das zweite nicht.

Die Ausgabe der folgenden zwei Beispiele:

// Example 1 - Synchronous (blocks)
var result = database.query("SELECT * FROM hugetable");
console.log("Query finished");
console.log("Next line");


// Example 2 - Asynchronous (doesn't block) 
database.query("SELECT * FROM hugetable", function(result) {
    console.log("Query finished");
});
console.log("Next line");

Wäre:

  1. Query finished
    Next line
  2. Next line
    Query finished

Hinweis
Während Node selbst Single-Threaded ist, gibt es einige Tasks, die parallel ausgeführt werden können Dateisystemvorgänge finden beispielsweise in einem anderen Prozess statt.

Das ist der Grund, warum Node asynchrone Operationen ausführen kann: Ein Thread führt Dateisystemoperationen aus, während der Hauptthread Node) Ihren Javascript-Code weiterhin ausführt Server wie Node benachrichtigt der Dateisystemthread den Hauptthread Node= über bestimmte Ereignisse wie Abschluss, Fehler oder Fortschritt sowie über alle mit diesem Ereignis verbundenen Daten (z. B. das Ergebnis einer Datenbank) Abfrage oder eine Fehlermeldung) und der Haupt-Thread Node entscheidet, was mit diesen Daten geschehen soll.

Sie können hier mehr darüber lesen: Wie das nicht blockierende Single-Thread-Modell IO in Node.js funktioniert

211
Salvatorelab

Der Unterschied zwischen diesen beiden Ansätzen ist wie folgt:

Synchroner Weg: Wartet auf den Abschluss jeder Operation, danach führt es nur die nächste Operation aus. Für Ihre Abfrage: Der Befehl console.log() wird erst dann ausgeführt, wenn die Abfrage vollständig ausgeführt wurde, um das gesamte Ergebnis aus der Datenbank abzurufen.

asynchrone Methode: 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 Befehl console.log() wird kurz nach der Methode Database.Query() ausgeführt. Während die Datenbankabfrage im Hintergrund ausgeführt wird und das Ergebnis lädt, sobald das Abrufen der Daten abgeschlossen ist.

Anwendungsfälle

  1. Wenn Ihre Vorgänge nicht sehr anstrengend sind, wie z. B. das Abfragen großer Datenmengen von der Datenbank, fahren Sie mit der synchronen Methode fort, andernfalls mit der asynchronen Methode.

  2. 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.

70
Santosh Panda

Dies wird etwas deutlicher, wenn Sie beiden Beispielen eine Zeile hinzufügen:

var result = database.query("SELECT * FROM hugetable");
console.log(result.length);
console.log("Hello World");

Der zweite:

database.query("SELECT * FROM hugetable", function(rows) {
   var result = rows;
   console.log(result.length);
});
console.log("Hello World");

Führen Sie diese aus, und Sie werden 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 database.query Asynchron im Hintergrund ausgeführt wird und das Skript sofort mit "Hello World" fortgesetzt wird. Die console.log(result.length) wird nur ausgeführt, wenn die Datenbankabfrage abgeschlossen ist.

22
Martijn

Zunächst stelle ich fest, dass ich diese Frage zu spät beantworte.

Bevor wir uns mit synchron und asynchron befassen, wollen wir uns kurz mit der Ausführung von Programmen befassen.

Im Fall synchron 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 den Code betrachtet und Vorgänge in Warteschlangen einreiht, und einem anderen, der die Warteschlange verarbeitet. Die Verarbeitung der Warteschlange erfolgt in einem Thread. Daher kann immer nur eine Operation gleichzeitig 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 wird, wenn diese Operation abgeschlossen ist. Die Warteschlange enthält möglicherweise bereits viele Vorgänge. Die Operation am Anfang 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 Vorgang abgeschlossen ist, wird der Rückruf nach Abschluss ausgeführt. Zu diesem Zeitpunkt bewegt sich der Warteschlangenprozessor, der die Operation "gehandhabt" hat, zur nächsten Operation - in diesem Fall

    console.log("Hello World"); 

Die Datenbankabfrage wird noch verarbeitet, aber der Vorgang console.log befindet sich am Anfang der Warteschlange und wird verarbeitet. Dies ist eine synchrone Operation, die sofort ausgeführt wird und die Ausgabe "Hello World" ergibt. Einige Zeit später wird der Datenbankvorgang abgeschlossen. Erst dann wird der mit der Abfrage registrierte Rückruf aufgerufen und verarbeitet, wobei der Wert der Variablen result auf rows festgelegt 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 Rückrufs, der bei einer asynchronen Operation registriert wurde, wird das Ergebnis der Operation zur Laufzeit von JavaScript zurückgegeben, wenn die Operation abgeschlossen ist.

Eine einfache Methode, um festzustellen, 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 sehen wir, dass nur der zweite Fall einen Rückruf hat, es ist also die asynchrone Operation der beiden. Dies ist nicht immer der Fall, da das Ergebnis einer asynchronen Operation unterschiedlich behandelt wird.

Lesen Sie mehr über Versprechen, um mehr zu erfahren. Versprechungen 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 an. In Fällen, in denen der Vorgang nicht lange dauert und nicht häufig verwendet wird - wie beim Lesen einer Konfigurationsdatei - führt der synchrone Vorgang zu einem Code, der einfacher zu lesen ist.

18
Jay

Im synchronen Fall wird der Befehl console.log erst ausgeführt, nachdem die SQL-Abfrage ausgeführt wurde.

Im asynchronen Fall wird der Befehl console.log direkt ausgeführt. Das Ergebnis der Abfrage wird dann einige Zeit später von der Funktion "Rückruf" gespeichert.

5
related

Der Hauptunterschied besteht in der asynchronen Programmierung. Andernfalls wird die Ausführung nicht gestoppt. Sie können weitere Codes ausführen, während die Anforderung ausgeführt wird.

4
thebreiflabb

Die Funktion macht die zweite asynchron.

Die erste erzwingt, dass das Programm wartet, bis jede Zeile abgearbeitet ist, bevor die nächste fortgesetzt werden kann. Die zweite ermöglicht, dass jede Linie gleichzeitig (und unabhängig) läuft.

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).

2
Anton Chan

Sync Programming

Programmiersprachen wie C, C #, Java) sind Synchronisationsprogramme. Was auch immer Sie schreiben, wird in der Reihenfolge Ihres Schreibens ausgeführt.

-GET DATA FROM SQL.
//Suppose fetching data take 500 msec

-PERFORM SOME OTHER FUNCTION.
//Performing some function other will take 100 msec, but execution of other 
//task start only when fetching of sql data done (i.e some other function 
//can execute only after first in process job finishes).

-TOTAL TIME OF EXECUTION IS ALWAYS GREATER THAN (500 + 100 + processing time) 
msec

asynchron

NodeJs bietet eine asynchrone Funktion, die von Natur aus nicht blockiert, vorausgesetzt, bei einer 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 fange an, die nächsten Aufgaben in der Warteschlange auszuführen, und jedes Mal, wenn diese zeitaufwendige Aufgabe erledigt ist, wird dies durch Rückruf benachrichtigt. Folgendes Beispiel hilft:

//Nodejs uses callback pattern to describe functions.
//Please read callback pattern to understand this example

//Suppose following function (I/O involved) took 500 msec
function timeConsumingFunction(params, callback){
  //GET DATA FROM SQL
  getDataFromSql(params, function(error, results){
    if(error){
      callback(error);
    }
    else{
      callback(null, results);
    }
  })
}

//Suppose following function is non-blocking and took 100 msec
function someOtherTask(){
  //some other task
  console.log('Some Task 1');
  console.log('Some Task 2');
}

console.log('Execution Start');

//Start With this function
timeConsumingFunction(params, function(error, results){
    if(error){
      console.log('Error')
    }
    else{
      console.log('Successfull'); 
    }
  })

//As (suppose) timeConsumingFunction took 500 msec, 
//As NodeJs is non-blocking, rather than remain idle for 500 msec, it will start 
//execute following function immediately
someOtherTask();

Kurz gesagt, Ausgabe ist wie folgt:

Execution Start
//Roughly after 105 msec (5 msec it'll take in processing)
Some Task 1
Some Task 2
//Roughly After 510 msec
Error/Successful //depends on success and failure of DB function execution

nterschied ist klar, wo die Synchronisierung definitiv mehr als 600 (500 + 100 + Verarbeitungszeit) ms dauern wird, Async spart Zeit.

0
Neeraj Bansal