2016-04-25 3 views
0

私はnode.jsがシングルスレッドで同期していることを読んでいます。ただし、I/O要求は非同期に実行されます[1]node.js - コード実行パスについての精度

私は質問があります。次のコードスニペットが与えられます。

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

キューに2つの要求があるとします。私の理解は次のとおりです:最初の要求は、このパス#1 - >#2 - >#4 - >#3を行います。その後、第2の要求が処理される。

私が読んできたことから、著者は#1 - >#2 - >#4を暗示しているようです。 #3は非同期(I/Oを待っている)なので、2番目の要求はその間に処理されます。

誰でもこれを明確にすることができますか?ありがとう。

答えて

0

Node.jsイベントフローは、非同期のコールバックに基づいています。

このように、Node.jsがシングルスレッドであっても、コールバックをとる関数を呼び出すと、その関数は同期コードの実行をブロックせずに非同期に呼び出されます。

この例では、クエリ関数が最後のパラメータとしてコールバックを受け入れることがわかります。呼び出されると、Node.jsはイベントフローで実行を送信し、次のコード行に進みます。

この例では、#2パスはありません。'SELECT SLEEP(20);'がクエリ関数の最初のパラメータです。 2番目のパラメータは、クエリ関数が結果を返すときに実行されるコールバック関数function (err, results, fields) {}です。

流れは#1であろう - >#3 - >#2:

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

#1は、20S用MySQLデータベース睡眠を行うので、#1 - >#3 - >#2を意味#2 20代後に実行されます。その後、#1は実行をブロックします。 – Kamil

+0

本当に。 node.jsの実行フローについて話しています。 'SELECT SLEEP(20000)'のようなものを作成すると、dbは20秒間スリープ状態になりますが、node.jsはブロックされず、次のコード行が引き続き実行されます。他のロジックは、構築しているアプリケーションによって異なります。 –

+0

#3に時間がかかる場合は、パスが#1 - >#2 - >#3になると仮定できますか? – Kamil

関連する問題