← 질문 목록
#389깊이 0
싱글 스레드인 JS에서 비동기 작업이 멈추지 않고 도는 이유는 무엇인가?
언어 · 런타임
브라우저나 Node.js 같은 런타임 환경이 백그라운드 작업과 태스크 큐로 비동기 처리를 넘겨주기 때문이다. JS 엔진 자체는 콜 스택 하나로 동기 코드만 실행한다.
콜 스택→Web API
비동기 호출 요청
Web API→태스크 큐
작업 완료 후 콜백 등록
이벤트 루프→콜 스택
스택이 비면 큐의 콜백을 이동
타이머나 네트워크 요청은 엔진 외부의 Web API나 시스템 백그라운드에서 따로 처리한다. 이 처리가 끝나면 등록한 콜백 함수가 태스크 큐로 들어간다.
이벤트 루프는 콜 스택이 비어 있는지 끊임없이 감시한다. 스택이 완전히 비면 태스크 큐에 대기 중인 콜백을 순서대로 스택에 밀어 넣는다.
이 과정으로 메인 스레드는 멈추지 않고 다음 동기 작업을 실행한다. 무거운 연산이 콜 스택을 점유하면 이벤트 루프가 작동하지 않아 브라우저가 먹통이 된다.