Javascript Deep Dive-42章(非同期プログラミング)
7782 ワード
同期処理と非同期処理
関数を呼び出すと、関数コードが計算され、関数実行コンテキストが生成されます.
生成された関数実行コンテキストは、実行コンテキストスタック(呼び出しスタック)にプッシュされ、関数コードが実行されます.
関数コードの実行が終了すると、関数実行コンテキストが実行コンテキストスタックからポップアップされ、削除されます.
次の例のfoo関数とbar関数は、スタックデータ構造実行コンテキストスタックに呼び出し順にプッシュされます.
const foo = () => {};
const bar = () => {};
foo();
bar();
関数を実行するには、関数コード評価中に生成された関数実行コンテキストを実行コンテキストスタックにプッシュする必要があります.すなわち、実行コンテキストスタックにおいて関数実行コンテキストをプッシュすることは、関数実行の開始を意味する.
関数が呼び出し順に実行されるのは、関数が呼び出し順に実行されるコンテキストが実行コンテキストスタックにプッシュされるためです.
これらの関数の実行順序は、実行コンテキストスタックによって管理されます.
JavaScriptエンジンには、実行コンテキストスタックが1つしかありません.
これは、関数を実行できるウィンドウが1つしかなく、2つ以上の関数を同時に実行できないことを意味します.
実行コンテキストスタックの最上位要素「実行中の実行コンテキスト」を除いて、すべての実行コンテキストは実行対象のタスクです.
現在実行中の実行コンテキストがポップアップされ、実行コンテキストスタックから削除されると、待機タスクは現在実行中の関数が終了したときに実行されます.
このようにJavaScriptエンジンは単一スレッドで動作し,一度に1つの技術しか実行できない.単一スレッド方式では一度に1つのテクノロジーしか実行できないため、実行に時間がかかるテクノロジーではブロックが発生します.
たとえば、settimeout関数に似たコールバック関数を呼び出すsleep関数を実装します.
//sleep 함수는 일정 시간이 경과한 이후에 콜백 함수를 호출한다.
function sleep(func, delay) {
//Date.now()는 현재 시간을 숫자(ms)로 반환한다.
const delayUntil = Date.now() + delay;
//현재 시간에 delay를 더한 delayUntil이 현재 시간보다 작으면 계속 반복한다.
while(Date.now() < delayUntil);
//일정 시간(delay)이 경과한 이후에 콜백 함수(func)를 호출한다.
func();
}
function foo() {
console.log('foo');
}
function bar() {
console.log('bar');
}
//sleep 함수는 3초 이상 실행된다.
sleep(foo, 3 * 1000);
//bar 함수는 sleep 함수의 실행이 종료된 이후에 호출되므로 3초 이상 블로킹된다.
bar();
//(1초 경과 후) foo 호출 -> bar 호출
上記の例のsleep関数は、foo関数を3秒後に呼び出す.bar関数はsleep関数が停止した後に呼び出されます.
3秒以上(foo関数の実行時間+3秒)は呼び出せずブロックされます.
このように、現在実行されている技術が終了する前に次の実行を待つ技術待機を同期処理と呼ぶ.同期処理方式の利点は、逐次処理技術により実行順序が保証されることであるが、前のタスクが終了する前に後続のタスクがブロックされるという欠点がある.
function foo() {
console.log('foo');
}
function bar() {
console.log('bar');
}
//타이머 함수 setTimeout은 일정 시간이 경과된 이후에 콜백 함수 foo를 호출한다.
// 타이머 함수 setTimeout은 bar 함수를 블로킹하지 않는다.
setTimeout(foo, 3*1000);
bar()
settimeout関数は、前述したsleep関数と同様に、コールバック関数を呼び出しますが、settimeout関数の後のタスクをブロックするのではなく、直接実行します.現在実行中のタスクがまだ終了していない場合でも、次のタスクを直ちに実行する方法を非同期処理と呼ぶことができます.同期処理方式の利点は、タスクが順番に処理され、実行順序が保証されることであるが、前のタスクが終了する前に後続のタスクがブロックされるという欠点がある.
非同期処理方法の利点は、現在実行中のタスクがまだ終了していない場合でも、すぐに次のタスクが実行されるため、ブロックは発生しないが、タスクの実行順序が保証されないことである.
非同期処理を実行する非同期関数は、従来、コールバックモードが使用されている.非同期処理に用いるコールバックモードは、コールバックを発生させ、可読性を悪くし、非同期処理で発生するエラー異常を処理することが困難であり、複数の非同期処理を一度に処理することにも一定の限界がある.この点については、第45節のプロミスで詳しく議論します.
タイマ関数settimeout、setInterval、HTTPリクエスト、イベントハンドラは非同期で動作します.
非同期処理は、イベントループおよびタスクキューに関連します.
イベントループとタスクキュー
Reference
この問題について(Javascript Deep Dive-42章(非同期プログラミング)), 我々は、より多くの情報をここで見つけました https://velog.io/@tchaikovsky/Javascript-Deep-Dive-42장-비동기-프로그래밍テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol