[Javascript] Event Loop์ Call Stack โญ
const fs=require('fs')
/*1*/
const aaa=()=>{ setTimeout(()=>{console.log('d');}); console.log('c') };
/*2*/
setTimeout(()=>{
fs.readFile('any.txt',()=>{
setTimeout(()=>{ console.log('e'); },0);
setImmediate(()=>{ console.log('f'); })
})},100) ;
/*3*/
setTimeout(()=>{console.log('a');aaa()})
/*4*/
Promise.resolve().then(()=>{aaa(); console.log('b');})
c
b
a
c
d
d
f
e

๋น๋๊ธฐ ์ฒ๋ฆฌ์์ ์์ค์ฝ๋์ ํ๊ฐ์ ์คํ์ ์ ์ธํ ๋ชจ๋ ์ฒ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ / Node.js๊ฐ ๋ด๋นํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Call Stack(LIFO)์ ์คํ ์์๋๋ก ์์ด๊ณ ์คํ์ด ๋๋๋ฐ
WEB APIs์ ํด๋นํ๋ ๊ฒ๋ค์ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ํด Callback Queue๋ฅผ ์ฌ์ฉํฉ๋๋ค.
WEB API์๋ setTimeout, Promise์ then(), AJAX ๊ฐ ์์ต๋๋ค.
1) Call stack์ผ๋ก 2๋ฒ setTimeout(100)์ด ๋ค์ด์ค๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด Callback Queue์ Task Queue๋ก ๋ค์ด๊ฐ๋๋ค.
2) Call stack์ผ๋ก 3๋ฒ setTimeout(0)์ด ๋ค์ด์ค๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด Callback Queue์ Task Queue๋ก ๋ค์ด๊ฐ๋๋ค.
3) Call stack์ผ๋ก 4๋ฒ Promise๊ฐ ๋ค์ด์ค๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌ (then)์ ์ํด Callback Queue์ Micro task Queue๋ก ๋ค์ด๊ฐ๋๋ค.
=> Call stack ๋น์ด์๋ ์ํ ์ด๋ฏ๋ก, Callback Queue๊ฐ ์ํ๋ ์ ์๋ค.
4) Callback Queue์์๋ ์ ์ผ ๋จผ์ Micro task Queue๊ฐ ์ํ๋๊ธฐ ๋๋ฌธ์, Promise ์ then()์ฝ๋๊ฐ ์คํ๋๊ณ ,
Callstack์ 4๋ฒ์ aaa()๊ฐ ์์
๋๋ค.
4-1) aaa()๋ด๋ถ์ setTimeout(0) ์ด Task Queue๋ก ๋ค์ด๊ฐ๋๋ค.
4-2) Callstack์ console.log('c')๊ฐ ๋ค์ด์ค๊ณ ํ๋ฉด์ c๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค
4-3) aaa()๋ ์ข
๋ฃ๋ฉ๋๋ค5) Callstack์ aaa()๋ ์ฌ๋ผ์ง๊ณ , Callstack์ console.log('d')๊ฐ ๋ค์ด์ค๊ณ ํ๋ฉด์ d๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค
6) Callback Queue์ Task Queue์์ ์๊ฐ์ด 0์ธ 3๋ฒ์ด ์ํ๋์ด ํ๋ฉด์ a -> c -> d ์์ผ๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
7) Callback Queue์ Task Queue์์ ์๊ฐ์ด 0์ธ 4์์ ํธ์ถ๋์๋ 1๋ฒ์ setTImeout์ด ์ํ๋์ด d๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
8) Callback Queue์ Task Queue์์ ๋ง์ง๋ง์ผ๋ก ๋จ์์๋ 2๋ฒ์ setTimeout์ด ์ํ๋๊ณ ,
fs.readFile ๋ด (I/O ์ฒ๋ฆฌ) setTimeout๊ณผ setImmediate๊ฐ ์ฌ์ฉ๋์์ผ๋ฏ๋ก setImmediate => setTimeout ์์ผ๋ก Callback Queue์ Task Queue์ ๋ค์ด๊ฐ ์ํ๋ฉ๋๋ค. ๊ทธ๋์ ํ๋ฉด์ f e ์์๋ก ์ถ๋ ฅ์ด ๋ฉ๋๋ค.
์ฆ, c b a c d d f e ์์ผ๋ก ์ํ์ด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Microtask Queue์ ํด๋นํ๋ Promise์ฝ๋๊ฐ ๋จผ์ ์ฌ์ฉ๋๋ค.
file I/O ๋ด๋ถ์์๋ ๋ฌด์กฐ๊ฑด setImmediate๊ฐ ๋จผ์ ์คํ๋๋ค.
๊ด๋ จ ๊ฐ์/๋ธ๋ก๊ทธ
https://www.youtube.com/watch?v=S1bVARd2OSE
https://meetup.toast.com/posts/89
์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ ๋ฃจํ : NHN Cloud Meetup
์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ ๋ฃจํ
meetup.toast.com
> Node.js์ ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ด๋ฒคํธ ๋ฃจํ์ ๋ํ ํํํ ์ดํด๊ฐ ์๋ค๋ฉด ์์์น ๋ชปํ ๋ฒ๊ทธ ์์ ์ข์ ํ๊ฒ ๋ ์ง๋ ๋ชจ๋ฅธ๋ค.
| [Javascript] ๋น๋๊ธฐ ์ฒ๋ฆฌ(3): async/await (0) | 2021.08.17 |
|---|---|
| [Javascript] ๋น๋๊ธฐ ์ฒ๋ฆฌ(2): Promise โญ (0) | 2021.08.17 |
| [React] Virtual-DOM, Reconciliation, fiber (0) | 2021.06.21 |
| [MongoDB] Model Relationships Between Documents (3) (0) | 2021.06.10 |
| [MongoDB] Model Relationships Between Documents (2) (0) | 2021.06.10 |