Event Loop
개념
Event Loop는 이벤트들이 막힘없이 계속 실행될 수 있도록 Call Stack과 Timer, Message Queue 등을 감시하고 적재적소에 함수들을 이동시키고 실행하는 역할을 수행합니다.
Node.js가 non-blocking IO와 비동기 처리를 할 수 있는 이유가 바로 Event Loop이기 때문이다.
Node.js는 single thread로 작동된다. 이 의미는 한번에 한개의 일만 수행한다는 의미다.
이런 제약사항은 오히려 도움이 된다. 왜냐하면 이 제약사항은 동시성 이슈에 대한 걱정 없이 코딩 할 수 있게 해주기 때문이다.
우린 단지 무한 루프나 동기식 network 연결같은 blocking 하는 코드를 작성하지만 않으면 된다. 얼마나 편리한가!
Call stack
LIFO (Last In, First Out) stack.
우리가 작성한 코드는 stack에 쌓여 차근차근 코드를 실행시키면서 stack을 비운다.
Queuing function execution
Example
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {
console.log('foo')
setTimeout(bar, 0) //queuing
baz()
}
foo()
Output
foo
baz
bar
The Message Queue
setTimeout
호출되면 Node.js는 timer를 통해 시간을 잰다. 시간이 오바되면, callback function은 Message Queue로 들어간다.
call stack에게 먼저 실행시키게 양보한다. 즉 call stack에 있는 모든 것들이 처리되어 empty가 되었을 때, message queue에 있는 것을 뽑아서 수행한다.
ES6 Job Queue
Promise
의 경우 call stack에 비어질 때까지 기다리는 것이 아닌 가능한 빨리 비동기 함수에 대한 결과를 실행하는 방법입니다.
현재 함수가 끝나기 전에 resolve되는 promise는 call stack이 empty 되자마자 바로 실행합니다.
본문에서는 이를 rollercoaster에서 일반줄과 fastpass 줄로 나눠서 설명합니다.
일반줄은 (message queue) 무작정 순서대로 기다려야 하고, fastpass 줄(job queue)는 우선권을 갖습니다.
그래서, 항상 fastpass 줄이 없어져야 일반줄이 줄어듭니다.