[JS리뷰] 비동기 프로그래밍

frenchkebab·2024년 5월 15일

JS정리

목록 보기
2/2

비동기 프로그래밍

Thread란?

-> 8개의 core가 각각 2개의 Thread를 갖고 있어 총 16개 스레드를 사용할 수 있다는 뜻임.

Thread는 가장 작은 단위의 working unit으로, 최대 동시에 16개의 작업을 CPU가 할 수 있다는 것을 의미한다.

JS는 Single Thread다.

JS는 어느 한 순간에 동시에 단 하나의 작업만 실행할 수 있다.

매우 비효율적으로 느껴지지만, Async Programming으로 이 단점을 극복할 수 있다.

Sync Programming (동기 프로그래밍)

2초가 걸리는 작업이 현재 JS runtime의 resource를 전혀 사용하지 않고 있다고 해도, 그것과 관계없이 thread가 2초동안 막혀버리게 된다.

function longWork() {
  const now = new Date();

  /**
   * milliseconds since epoch
   *
   * 1970년 1월 1일 부터 지금 코드가 실행되는 순간까지의 시간을 milliseconds로 반환
   */
  const milliseconds = now.getTime();
  const afterTwoSeconds = milliseconds + 2 * 1000;

  // 2초동안 어떠한 연산을 한다고 가정
  while (new Date().getTime() < afterTwoSeconds) {
    // do nothing
  }

  console.log('완료');
}

console.log('Hello');
longWork(); // 2초동안 block됨
console.log('World');

longWork() (실제로는 api요청 혹은 filewrite 기다리는 등)를 실행하는 동안에 아무것도 하지 않는데, Thread가 막혀버려서 리소스가 낭비되게 됨.

Async Programming (비동기 프로그래밍)

function longWork() {
  // 비동기로 수행됨
  setTimeout(() => {
    console.log('완료');
  }, 2000);
}

console.log('Hello');
longWork(); // 2초동안 block되지 않음
console.log('World');

결과

Hello
World
완료


setTimeout()을 실행하자 마자 thread가 다시 사용이 가능해짐.
(2초의 시간동안 다른 코드를 실행할 수가 있게됨)

따라서, 비동기 프로그래밍을 활용하면 싱글스레드로 JS runtime을 실행하더라도, 효율적으로 thread를 작업할 수 있게 된다!

이 효율이 어디서 오는지 아래 Event Loop에서 확인해보자

Event Loop

Sync 함수들을 호출하는 경우

Async 함수를 호출하게 되면?

비동기 함수가 콜스택에 올라가게 되면

이렇게 Task Queue로 옮겨져서 Call Stack을 막지 않는다.

여기서부터 Event Loop가 중요하게 된다.

Event Loop

Event Loop는 JS runtime이 생성되는 순간에 생긴다.

Event Loop는 *Task Queue를 계속 바라보며 실행이 종료가 된 함수가 있는지를 계속 확인한다. 또한 Call Stack이 비어있는지를 확인하게 된다.

따라서 위의 상황에서 Task Queue 안의 function2가 종료되었는지를 확인하고,
Call Stack이 비어있다면

Call Stack에 function2를 올린다.


그리고 동기 작업이 종료되면 Call Stack에서 Pop을 시킨다.

profile
Blockchain Dev Journey

0개의 댓글