JavaScript

Event Loop, Web APIs, (Micro)task Queue

presentKey 2024. 6. 15. 01:07

πŸƒ‍♀️ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μ²˜λ¦¬ν•  수 μžˆλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμ΄λ‹€. μ΄λŠ” ν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ”λ° μ‹œκ°„μ΄ 였래 κ±Έλ¦°λ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”λŠ” blocking이 λ°œμƒν•  수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ λ„€νŠΈμ›Œν¬ μš”μ²­, 타이머 λ“± μž‘μ—…μ΄ λ°œμƒν–ˆμ„ λ•Œ, ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”μ§€ μ•Šκ³  λ‹€λ₯Έ μž‘μ—…λ“€μ΄ μ‹€ν–‰λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. μ΄λŠ” setTimeout, Promise λ“± Web APIs 쀑 비동기 μž‘μ—…μ„ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ•„λ‹Œ λΈŒλΌμš°μ €κ°€ λ‹΄λ‹Ήν•˜μ—¬ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

πŸ”₯ μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„ κ³Όμ •

Call Stack: ν•¨μˆ˜ 호좜 μ‹œ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 콜 μŠ€νƒμ— ν‘Έμ‹œλ˜κ³  순차적 μ‹€ν–‰ λœλ‹€. 싀행이 μ™„λ£Œλ˜λ©΄ 콜 μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.

Web APIs: setTimeout, Promise λ“± 비동기 μž‘μ—…μ„ 콜 μŠ€νƒμ—μ„œ 가져와 λΈŒλΌμš°μ €κ°€ λ‹΄λ‹Ήν•˜λ„λ‘ ν•œλ‹€.

Task Queue: setTimeoutκ³Ό 같은 비동기 ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜ λ˜λŠ” 이벀트 ν•Έλ“€λŸ¬κ°€ μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­

Microtask Queue: ν”„λ‘œλ―ΈμŠ€ 후속 처리 λ©”μ„œλ“œ ‘then’, ‘catch’, ‘finally’의 콜백 ν•¨μˆ˜, await 이후 μ½”λ“œ 등이 μΌμ‹œμ μœΌλ‘œ λ³΄κ΄€λ˜λŠ” μ˜μ—­μ΄λ‹€. Task Queue보닀 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€.

Event Loop: 콜 μŠ€νƒμ΄ λΉ„μ–΄μžˆλŠ”μ§€, (micro)task queue에 λŒ€κΈ° 쀑인 ν•¨μˆ˜κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜μ—¬, λŒ€κΈ° 쀑인 ν•¨μˆ˜λ₯Ό 콜 μŠ€νƒμœΌλ‘œ μ΄λ™μ‹œν‚¨λ‹€.

 

이미지 및 μ˜μƒ μ°Έκ³ 
https://www.lydiahallie.com/blog/event-loop
https://www.youtube.com/watch?v=eiC58R16hb8
  1. Call Stack에 ν•¨μˆ˜κ°€ ν‘Έμ‹œλ˜κ³  순차적으둜 μ‹€ν–‰λœ ν›„ μ œκ±°λœλ‹€.
  2. λ§Œμ•½ 비동기 ν•¨μˆ˜ setTimeout 이 ν‘Έμ‹œλ˜λ©΄, Web APIs μ˜μ—­μœΌλ‘œ μ΄λ™ν•œλ‹€.
  3. μ§€μ •λœ λ”œλ ˆμ΄ μ‹œκ°„μ΄ μ§€λ‚œ ν›„, setTimeout의 μ½œλ°±ν•¨μˆ˜κ°€ Task Queue μ˜μ—­μœΌλ‘œ μ΄λ™ν•œλ‹€.
  4. EventLoopκ°€ 콜 μŠ€νƒμ΄ λΉ„μ—ˆλŠ”μ§€ 확인 ν›„, Task Queue에 λŒ€κΈ° μ€‘μ΄λ˜ setTimeout의 μ½œλ°±ν•¨μˆ˜κ°€ Call Stack으둜 μ΄λ™ν•œλ‹€.
  5. SetTimeout의 μ½œλ°±ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.

 

πŸ‘€ 염두할 점

Event LoopλŠ” Queue에 λŒ€κΈ° 쀑인 ν•¨μˆ˜λ₯Ό Call Stack이 λΉ„μ–΄μžˆμ„ λ•Œλ§Œ 보낸닀. λ§Œμ•½ Call Stack이 λΉ„μ–΄μžˆμ§€ μ•Šλ‹€λ©΄, setTimeout의 μ§€μ •λœ λ”œλ ˆμ΄ μ‹œκ°„λ³΄λ‹€ 더 였래 지연될 수 μžˆλ‹€.

 

그리고 Microtask Queueκ°€ Task Queue보닀 μš°μ„ μˆœμœ„κ°€ λ†’λ‹€. Microtask Queue에 λŒ€κΈ°μ€‘μΈ ν•¨μˆ˜κ°€ μ—†μ„λ•ŒκΉŒμ§€ Task Queue의 ν•¨μˆ˜λŠ” Call Stack으둜 μ΄λ™ν•˜μ§€ λͺ»ν•œλ‹€.

 

🧷 참고

https://www.lydiahallie.com/blog/event-loop

https://www.youtube.com/watch?v=eiC58R16hb8

https://dkrnfls.tistory.com/362