2016-04-25 5 views
0

Ich habe gelesen, dass node.js single-threaded und synchron ist. E/A-Anforderungen werden jedoch asynchron ausgeführt [1].node.js - Präzision über Code Ausführungspfad

Ich habe eine Frage. Gegeben das folgende Code-Schnipsel:

c.query( //#1 
'SELECT SLEEP(20);', //#2 
    function (err, results, fields) { 
     console.log("query executed"); //#3 
    } 
); 
console.log("hello"); //#4 

Angenommen, es gibt 2 Anfragen in der Warteschlange. Mein Verständnis ist wie folgt: Die erste Anfrage führt diesen Pfad # 1 -> # 2 -> # 4 -> # 3. Danach wird die zweite Anfrage bearbeitet.

Von dem, was ich gelesen habe, scheint der Autor # 1 -> # 2 -> # 4 impliziert. Da # 3 asynchron ist (Warten auf E/A), wird die zweite Anfrage zwischenzeitlich bearbeitet.

Könnte jemand darüber klarstellen? Vielen Dank.

Antwort

0

Der Ereignisablauf von Node.js basiert auf Rückrufen, die asynchron sind.

Auf diese Weise wird diese Funktion, auch wenn Node.js single threaded ist, beim Aufruf einer Funktion, die einen Callback aufruft, asynchron aufgerufen, ohne die Ausführung des synchronen Codes zu blockieren.

In dem Beispiel, das Sie eingefügt haben, können Sie sehen, dass die Abfrage Funktion einen Rückruf als letzten Parameter akzeptiert. Sobald es aufgerufen wird, sendet Node.js die Ausführung für den Ereignisfluss und fährt mit der nächsten Codezeile fort.

Um zu verdeutlichen, in diesem Beispiel gibt es keine # 2 Pfad, 'SELECT SLEEP(20);' ist der erste Parameter der Abfrage-Funktion. Der zweite Parameter ist die Callback-Funktion function (err, results, fields) {}, die ausgeführt wird, wenn die Abfragefunktion ein Ergebnis liefert.

Der Fluss wird # 1 -> # 2 -> # 3: Der MySQL-Datenbank Schlaf für 20, # 1

c.query('SELECT SLEEP(20);',//#1 
    function (err, results, fields) { 
     console.log("query executed"); //#2 
    } 
); 
console.log("hello"); //#3 
+0

Da # 1 macht -> # 3 - 2> # 2 bedeutet, dass # wird nach 20s ausgeführt. Dann blockiert # 1 die Ausführung, richtig? – Kamil

+0

Nicht wirklich. Wir sprechen über den Ausführungsablauf von node.js. Wenn Sie etwas wie 'SELECT SLEEP (20000)' machen, wird Ihre Datenbank 20 Sekunden lang schlafen, aber node.js wird nicht blockiert und wird weiterhin die nächsten Codezeilen ausführen. Die andere Logik hängt von der Anwendung ab, die Sie erstellen. –

+0

Also, wenn # 3 lange dauert, dann können wir annehmen, dass der Pfad # 1 -> # 2 -> # 3 werden kann? – Kamil