インターネットに来ました.jsにおける「非同期/ブロック」などの概念の概要


一、「非同期非ブロック式」とは何ですか。


この名前は吐き気がしてわかりにくいが、パンツを買うことを実行プログラムにたとえると「非同期非ブロック式」の意味がわかりやすい.
例えばCPUのスレッドで、パンツを買うプログラムを実行する必要があります.必要な手順は大体次の通りです.
  • 店に行ってボスに聞いて、あなたの店にはnbブランドのパンツがありますか?
  • パンツを買って
  • 着て
  • 売店に行ってハムを買って家に帰って犬に
  • をあげます
    この場合、スレッドとして、いくつかの状況や選択に遭遇する可能性があります.
  • 店の中は商品がなくて、ボスはずっとあなたに承諾しないで、あなたもずっと待っています(同期)、3日目は商品があってやっとあなたにあることを教えて、あなたは急いで着て、更にハムを買いに行きます-[同期ブロックモード]
  • ボスはすぐにあなたに「品物がない」(あなたをブロックしない)と言って、それからあなたは毎日店に行って聞いて、品物があるまで急いで着て、それから買い物に行って犬に餌をあげます-[同期非ブロック]
  • ボスに荷物があったら電話して取りに来てください.ボスは「はい」(ブロックではありません)と言って、それから先に買い物に行って犬に餌をあげて、2日後にボスがあなたを呼んで、あなたはパンツを手に入れて着ました.[非同期非ブロック]
  • あなたはボスに荷物があったら電話して取りに来てくださいと言って、ボスはまたあなたに承諾していません(ブロックして)、それからあなたは先にハムを買うつもりでした(非同期)、この時も行けませんでした.-[非同期ブロック]
  • 明らかに、3つ目の方法は最も聡明で、前の2つの方法はいずれも効率が低下している.私たちの理解によれば
    同期または非同期は、プロセス全体を順次完了する必要があるかどうかを示します.
    ブロックまたは非ブロックは、呼び出された関数がすぐに結果を教えてくれるかどうかを意味します.

    二、jsにおけるブロックと同非同期


    関数とプログラムがあります.

    2.1 jsにおける同期ブロック

    //          ,               
    function copyBigFile(afile, bfile){
        var result = copyFileSync(afile,bfile);
        return result;
    }

    この「copyBigFile()」関数を呼び出し、大きなファイルを別のファイルにコピーすると、1時間かかります.この関数は1時間後に返されることを意味します.
    //      
    console.log("start copying ... ");    
    var a = copyBigFile('A.txt', 'B.txt');  //       1  
    console.log("Finished");   //             
    console.log("        ");  //             
    console.log("Hello World,          ,   "); //             

    以上のプログラムは同期ブロックの例であり,copyFileSync関数が値を返すプロセスには長い時間がかかるため,スレッドも実行し続けることができず,待つしかない.

    2.2 jsにおける同期非ブロック

    //           
    //        ,    true,          false
    function copyBigFile(afile,bfile){
        var copying = copyFileAsync(afile, bfile);
        var isFinished = !copying;
        return !isFinished; 
    }

    この関数を呼び出すとすぐに結果が返され、プログラムは
    console.log("start copying ... ");    
    while( a = copyBigFile('A.txt', 'B.txt')){
      console.log("             ");
    } ;  
    console.log("Finished");   //             
    console.log("Hello World,          ,   "); //             

    非ブロック式の関数は、プログラミングに便利さをもたらし、長IO操作と同時に、他のプログラムを書いて効率を高めることができます.実行結果は次のとおりです.
    start copying ...
                 
                 
                 
    ...
    Finished
    Hello World,          ,   

    2.3 jsにおける非同期非ブロック


    非ブロック式の関数はプログラミングに多くの柔軟性をもたらし,非ブロック式の関数が好きであることを示した.しかし、同期したプログラムは1つのループで結果をポーリングする必要があり、ループ内のプログラムは何度も実行されるため、正常なプログラムを書くのをコントロールすることができず、再利用しにくいことがわかります.したがって,非ブロック式の関数をより合理的に利用する必要がある.つまり、自分から結果を聞くのではなく、結果が出たら知らせてください.//これは非ブロック関数です//コピーが完了した場合はtrueを返し、完了していない場合はfalseを返します
    //               
    //       ,            copy    ,  success
    function copyBigFile(afile,bfile, callback){
        var copying = copyFileAsync(afile, bfile, function(){ callback();});
        var isFinished = !copying;
        return !isFinished; 
    }

    この関数が前の同期非ブロック関数と異なる点は、通知機能、すなわち、操作が完了した後にプログラムに「完了しました」をアクティブに通知できることである.次のようにプログラムがあります
    console.log("start copying ... ");    
    copyBigFile("A.txt","B.txt", function(){
              console.log("Finished");   //        
              console.log("Hello World,          ,   "); //        
              })
    console.log("     "); 
    console.log("       "); 
    

    プログラムはcopyBigFile関数を呼び出すと、すぐに戻り値を得ることができ、スレッドがブロックされていないので、他のことをして、copyBigFileが完了すると、指定した関数を実行することができます.プログラムの出力は、
    start copying ...
         
           
    Finished
    Hello World,          ,   

    この場合、プログラムは制御しやすく、プロセスがより明確になります.いくつかの「別の事柄」は、関数が通知されない前に処理することができ、スレッドの利用効率を十分に向上させることができます.

    三、昇格


    以上のプログラムでは、私たちのプログラムは巨大なファイルをコピーする必要があります.実はファイルをコピーするこの過程はシステムのIO呼び出しに残して完成したので、私たちのスレッドはコピーの詳細を処理する必要はありません.したがって,非ブロック式の関数により,スレッドリソースを利用して別のことをすることができる.非同期呼び出し方式により、プログラムフローを制御しやすくし、スレッドリソースをより効率的に利用することができる.
    jsは伝達関数によって非同期を実現する.(promiseによる非同期化も可能…)