インターネットに来ました.jsにおける「非同期/ブロック」などの概念の概要
6837 ワード
一、「非同期非ブロック式」とは何ですか。
この名前は吐き気がしてわかりにくいが、パンツを買うことを実行プログラムにたとえると「非同期非ブロック式」の意味がわかりやすい.
例えばCPUのスレッドで、パンツを買うプログラムを実行する必要があります.必要な手順は大体次の通りです.
この場合、スレッドとして、いくつかの状況や選択に遭遇する可能性があります.
同期または非同期は、プロセス全体を順次完了する必要があるかどうかを示します.
ブロックまたは非ブロックは、呼び出された関数がすぐに結果を教えてくれるかどうかを意味します.
二、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による非同期化も可能…)