1. ホーム
  2. ジャバスクリプト

[解決済み】同期プログラミングと非同期プログラミングの違いとは(node.jsの場合)

2022-04-19 17:52:19

質問

を読んでいます。 ノードビギナー そして、次の2つのコードに出会いました。

1つ目は

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

2枚目です。

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

データベースへの問い合わせを行い、問い合わせに対する答えを取得する、ということはわかった。そして console.log('Hello world') .

最初のものは、同期コードと思われるものです。 そして2つ目は非同期なコードです。

この2つの作品の違いは、私にはとても曖昧です。出力はどうなるのでしょうか?

非同期プログラミングでググってもダメでした。

どうすればいい?

での違いは 最初の例 の場合、プログラムは1行目でブロックされます。次の行( console.log を待つ必要があります。

での 第二例 を使用すると console.log は、クエリの処理中に実行されます。つまり、プログラムが他の処理をしている間、クエリはバックグラウンドで処理され、クエリデータの準備ができたら、それを使って好きなことをすることができるのです。

つまり、一言で言えば 最初の例はブロックされるが、2番目の例はブロックされない。

次の2つの例の出力です。

// 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");

でしょう。

  1. Query finished

    Next line
  2. Next line

    Query finished

備考

Node 自身は シングルスレッド しかし、いくつかのタスクは並行して実行することができます。例えば、ファイルシステムの操作は別プロセスで行われます。

そのため、Nodeは非同期処理を行うことができます。1つのスレッドがファイルシステム操作を行い、メインのNodeスレッドがあなたのjavascriptコードを実行し続けることができるのです。Node のようなイベント駆動型サーバでは、ファイルシステムスレッドは完了、失敗、進行などの特定のイベントを、そのイベントに関連するデータ(データベースクエリの結果やエラーメッセージなど)と共にメインノードスレッドに通知し、メインノードスレッドはそのデータに対して何をするかを決定します。

詳しくはこちらをご覧ください。 Node.jsにおけるシングルスレッド・ノンブロッキングIOモデルのしくみ