본문 바로가기
[Study] Deep Dive 스터디

[JS] 비동기 프로그래밍

by 지공A 2024. 1. 20.

42장 : 비동기 프로그래밍

1. 동기 처리와 비동기 처리 

  • 동기 처리 : 실행 중인 태스트가 종료할 때까지 다음에 실행될 태스트가 대기하는 방식
  • 비동기 처리 : 실행 중인 태스크가 종료되지 않은 상태라 해도 다음 태스크를 곧바로 실행하는 방식
function foo() {
  console.log('foo');
}

function bar() {
  console.log('bar');
}

// 타이머 함수 setTimeout이 bar 함수를 블로킹하지 않는다.
setTimeout(foo, 3 * 1000);
bar();
// bar 호출 -> (3초 경과 후) foo 호출
  • setTimeout, setInterval, HTTP 요청, 일부 메서드를 제외한 이벤트 핸들러는 비동기 처리 방식으로 동작한다.

2. 이벤트 루프와 태스크 큐

  • 대부분의 자바스크립트 엔진은 크게 2개의 영역으로 구분할 수 있다.
    • 콜 스택 : 소스코드 평가 과정에서 생성된 실행 컨텍스트가 추가되고 제거되는 스택 자료구조인 실행 컨텍스트 스택이 바로 콜 스택이다.
    • 힙(heap) : 힙은 객체가 저장되는 메모리 공간이다. 콜 스택의 요소인 실행 컨텍스트는 힙에 저장된 객체를 참조한다.
  • 브라우저 환경은 태스크 큐와 이벤트 루프를 제공한다.
    • 태스크 큐 : setTimeout이나 setInterval과 같은 비동기 함수의 콜백 함수 또는 이벤트 핸들러가 일시적으로 보관되는 영역이다.
    • 이벤트 루프 : 이벤트 루프는 콜 스택에 현재 실행중인 실행 컨텍스트가 있는지, 그리고 태스크 큐에 대기 중인 함수가 있는지 반복해서 확인한다. 태스크 큐에 일시 보관된 함수들은 비동기 방식으로 동작한다.
function foo() {
  console.log('foo');
}

function bar() {
  console.log('bar');
}

setTimeout(foo, 0); // 0초(실제는 4ms) 후에 foo 함수가 호출된다.
bar();
  • 비동기 함수인 setTimeout의 콜백 함수(foo)는 태스크 큐에 푸시되어 대기하다가 콜 스택이 비게 되면, 다시 말해 전역 코드 및 명시적으로 호출된 함수가 모두 종료하면 비로소 콜 스택에 푸시되어 실행된다.

Deep Dive Study week - 02

'[Study] Deep Dive 스터디' 카테고리의 다른 글

[JS] 이터러블  (0) 2024.01.23
[JS] 프로미스  (0) 2024.01.22
[JS] ES6 함수의 추가 기능  (0) 2024.01.16
[JS] 클로저  (0) 2024.01.14
[JS] this  (1) 2024.01.13