Nodejs-同期と非同期


Synchronous vs Asynchronous
データ処理方式には同期と非同期がある.名前を聞くとどうすればいいか分からない.講義や各種ブログ資料をもとに勉強していると、あまり難しくない概念であることがわかります.
まず、コンセプトから簡単に整理しておきます.

同期(Synchronous)

  • 連続シリアルタスク
  • サーバにリクエストを送信する場合は、次の操作を実行するために応答を返さなければなりません.
    例えば、買い物のためにスーパーに入ってから電話しましょう.では、レジでお会計をするためには、並ばなければなりません.また、出納係の立場では、次の顧客の物品を計算するには、顧客の物品を計算する必要があります.
    動機の仕方はこうです.同期は非同期よりも直感的であるが,データは順次処理されるため,Aは仕事が終わるまでBがしばらく待つ必要がある.

    非同期

  • 並列タスク
  • サーバに要求を送信すると、応答ステータスに関係なく、次の操作が実行されます.
    スターウォーズというゲームをしたことがあるはずだ.(水たまりゲーム)完全な初心者ではなく、一般のプレイヤーはマルチタスク処理を使用します.相手の主陣に対して私の兵力で攻撃を行い、同時に私の主陣生産棟で兵力生産を予約し、同時に別の建物を建てる.各ユニットと建物が実行するコマンドの完了時間は異なりますが、終了時間を待つことなく新しいコマンドを実行できます.
    非同期方式は同期方式よりも複雑である可能性があります.しかし、応答を得るには時間がかかるといえば、この時間内に他の操作が可能であるため、より効果的な方法である.
    では、同期と非同期の処理方法をコードで理解しましょう.接続node.js公式ホームページ.DOCSタブに入ると、モジュールの説明が表示されます.File Systemエントリを表示すると、fs.readFileSyncモジュールが表示されます.

    Nodeのモジュールは基本的にasyncであるが、syncは上述の特殊な場合にも提供される.
    次にatomを開き、実験のためにファイルを作成します.

    以上のように、readFileSyncモジュールは、file nameとしてパラメータ値を指定し、符号化方式としてオプションを指定することができる.まず、ファイルが存在する必要があるため、テキスト形式の単純なファイルを作成します.data.txt
    Hello Sync And Async
    次に、同期非同期を練習するファイルを作成します.
    名前はsync_async.jsです.sync_async.js
    var fs = require('fs');
    
    // Sync
    console.log(1);
    var data = fs.readFileSync('data.txt', {encoding:'UTF8'});
    console.log(data);
    
    // Async
    console.log(2);
    fs.readFile('data.txt', {encoding:'UTF8'}, function(err, data) {
      console.log(data);
    })
    
    まず、コンソールウィンドウでコードを実行し、同期で符号化された結果を表示します.

    まず1を印刷し、ファイルの内容を印刷することができます.では、非同期方式はどうでしょうか.

    同期方式と非同期方式は同じ順序で出力され、どの部分が異なるのか分かりません.同期と非同期の違いを理解するために、Asyncにコードを数行追加します.
    // Async
    console.log(2);
    fs.readFile('data.txt', {encoding:'UTF8'}, function(err, data) {
      console.log(3);
      console.log(data);
    })
    console.log(4);
    実行...

    非同期方式なので、同時に起動して処理通りに出力するはずです.まず2を出力し、同時にreadFile関数がバックグラウンドでデータの内容を処理し始める可能性がある.
    これを処理する時間はもちろん単純出力4よりも遅いので、最後にコールバック関数を出力すると実行は終了する.

    Nodejsの単一スレッド


    通常、javascriptは単一スレッドベースの言語と呼ばれます.JavaScriptドライバの環境では単一スレッドが使用されるためです.したがって,ノード上で発生する処理は一連のコールバックを処理することに相当する.また,エンジン自体は上から順に動作するスタック構造であるため,非同期処理はできない.しかし、学習によって明らかになった事実は、libuvライブラリの助けの下で、非同期コードが複数のスレッドを実行できることです.
    syncがいつ必要か、asyncがいつ必要かを理解し、状況に応じて適切に組み合わせてソリューションを提供します.これはバックエンド開発者の重要なスキルのセットに違いありません.