์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[Javascript] Event Loop์™€ Call Stack โญ

๐Ÿ˜Ž ์ง€์‹ in Action/React, Typescript, Javascript ๐ŸŒ

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2021. 6. 22. 11:35

๋ณธ๋ฌธ

 

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');})

์ด๋ฒคํŠธ ๋ฃจํ”„์™€ call back queue๋Š” ๋ธŒ๋ผ์šฐ์ €/node.js ๊ฐ€ ์ œ๊ณตํ•ด์ค€๋‹ค // web apis๋ผ๊ณ  ์“ด ๋ถ€๋ถ„์ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ๋“ค

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ์†Œ์Šค์ฝ”๋“œ์˜ ํ‰๊ฐ€์™€ ์‹คํ–‰์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ € / 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์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„์— ๋Œ€ํ•œ ํƒ„ํƒ„ํ•œ ์ดํ•ด๊ฐ€ ์—†๋‹ค๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ ์•ž์— ์ขŒ์ ˆํ•˜๊ฒŒ ๋  ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ