Event loop
Last updated
Last updated
μ΅κ·Ό μλ°μ€ν¬λ¦½νΈλΌλ μΈμ΄μ λν΄μ 곡λΆλ₯Ό νκ³ μλλ° μ΄λ²μλ μ΄λ²€νΈ 루νμ λν΄ κ³΅λΆν΄λ³΄λ € νλ€.
μ΄λ²€νΈ 루νλ λΈλΌμ°μ μ μλ°μ€ν¬λ¦½νΈ λ°νμ νκ²½ (Node js)μμ μμ μ μ€νν λ μ¬μ©λλ λ©μΈ μ€λ λμ΄λ€. λ³΄ν΅ "μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λ μΈμ΄μ΄λ€"λΌκ³ λ€ νλλ° κ·Έ μ΄μ κ° λ°λ‘ λ©μΈμ€λ λμΈ μ΄λ²€νΈ 루νκ° μ±κΈμ€λ λμ΄κΈ° λλ¬Έμ΄λ€.
κ·Έλ¦Όμ 보면μ μ΄λ²€νΈλ£¨νκ° μ΄λ»κ² λμνλμ§ μ΄ν΄λ³΄μ
λ¨Όμ κ·Έλ¦Ό μΌμͺ½μ νμλ μλ°μ€ν¬λ¦½νΈ μμ§μ 보μ. λ©λͺ¨λ¦¬ νμ΄λΌλ κ²κ³Ό μ½μ€νμ΄λΌλ κ²μΌλ‘ μ΄λ£¨μ΄μ Έ μλ€. λ©λͺ¨λ¦¬νμ λ©λͺ¨λ¦¬ ν λΉμ΄ μΌμ΄λλ κ³³μ΄κ³ , μ½μ€νμ μ΄λ¦ κ·Έλλ‘ μ€νμ½λκ° νλμ© μ€νμ ννλ‘ μμ΄λ κ³³μ΄λ€.
μμ μ½λλ₯Ό μ€ννκ² λλ©΄ λ¨Όμ λͺ¨λ μ½λλ₯Ό μ§μΉνλ λ©μΈν¨μλ₯Ό μ½μ€νμ λ¨Όμ λ£κ² λλ€. κ·Έλ¬λ€κ° κ°μ₯ λ§μ§λ§μ€μ ν¨μλ₯Ό νΈμΆνλ printSquare(4)
λ₯Ό λ§λκ² λμ΄ μ½μ€νμ μΆκ°λλ€. μ΄ν square
, multi
λ₯Ό μ°¨λ‘λ‘ νΈμΆνκ² λμ΄ μ½ μ€νμμλ { main - printSquare - square - multi }
μ μμΌλ‘ μμ΄κ² λλ€.(μ€νμ ννμ΄κΈ° λλ¬Έμ 맨 μμ multiκ° μμ¬μλ€.) μ΄μ μ€ν 맨 μμ μλ ν¨μλΆν° returnμ μν€λ©° νλμ© μ€νμμ μ κ±°νλ€.
μ¬μ€ μμ ννμμ ν¨μλ₯Ό μ½μ€νμ λ£λλ€κ³ νλλ° μ νν μκΈ°νλ©΄ ν¨μμ μ€ν 컨ν μ€νΈ (Execution Context)λ₯Ό μμ±νκ³ μ½μ€νμ λ£λ κ²μ΄λ€. λ§μ°¬κ°μ§λ‘ μ½μ€νμμ μ κ±°λ λλ ν¨μμ€ν 컨ν μ€νΈκ° μ κ±°λλ κ²μ΄λ€.
μ€ν 컨ν μ€νΈλ₯Ό μ¬κΈ°μ λ€ λ€λ£¨λ©΄ μ΄λ²€νΈ 루νλ₯Ό μ£Όμ λ‘ νλ ν¬μ€ν μμ μλκ°κ²κ°μ κ°λ¨ν μ€λͺ ν λ€λ₯Έ ν¬μ€ν μμ λ€λ£¨λ €κ³ νλ€.
μ€ν 컨ν μ€νΈλ κ°λ¨ν λ§νμλ©΄ μλ°μ€ν¬λ¦½νΈκ° μ€νλλ μμμ΄λ€. ν¬κ² 3κ°μ§λ‘ λΆλ¦¬λλλ°
μ μμ€ν 컨ν
μ€νΈ μ½λλ₯Ό μ€νν λ μ΅μ΄λ‘ μμ±λλ μ€ν 컨ν
μ€νΈμ΄λ€. μ½λλ΄μ©μ΄ μμ΄λ μ μκ°μ²΄μΈ window
μ μ΄λ₯Ό κ°λ¦¬ν€λ this
κ° μμ±λλ€. (λΈλΌμ°μ μμ console.log(this)
λ₯Ό μ€ννλ©΄ Window κ°μ²΄
κ° λμ€λ μ΄μ κ° λ°λ‘ μ΄κ²μ΄λ€.)
ν¨μμ€ν 컨ν μ€νΈ μ΅μ΄ μ½λ μ€ν μ΄ν ν¨μκ° νΈμΆλ λλ§λ€ κ° ν¨μλ³λ‘ μ€ν 컨ν μ€νΈλ₯Ό μμ±λλ€. λ°λΌμ ν¨μκ° νΈμΆλμ§ μμΌλ©΄ ν¨μμ€ν 컨ν μ€νΈλ μμ±λμ§ μλλ€.
ν·κ°λ¦¬λ©΄ μλλ μ μ ν¨μ μ μΈμ΄ μλλΌ μ€νμμ μμ±λλ€λ μ μ΄λ€.
Evalμ€ν 컨ν μ€νΈ
μ¦, μλ°μ€ν¬λ¦½νΈλ νλμ
Call Stack
μΌλ‘ λμνκΈ° λλ¬Έμ μ±κΈμ€λ λ μΈμ΄λΌλ κ²μ μμ μλ€.
κ·Έλ°λ° μ°λ¦¬κ° μ€μ λ‘ λΈλΌμ°μ /Node jsλ₯Ό μ¬μ©ν λλ μ¬λ¬κ°μ μ€λ λκ° μ¬μ©λλλ° μ΄λ€μμΌλ‘ μλνλμ§ μ΄ν΄λ³΄μ.
μ΄μ μ μμλ‘ λ€μλ μ½λμ λ¬λ¦¬ setTimeout
ν¨μκ° λ±μ₯νμ¬ λΉλκΈ° μμ
μ μννλ μ½λμ΄λ€. μ€μ λ‘ λΈλΌμ°μ μμμλ λΉλκΈ°λ‘ μμ²νλ μμ
μ΄ μμμ΄ λ§λ€.
λ¨Όμ μ μ½λκ° μλνλ κ³Όμ μ μ΄ν΄λ³΄μ
hi
ν¨μμ€ν 컨ν
μ€νΈμ respond
ν¨μμ€ν 컨ν
μ€νΈκ° μμλλ‘ μ½μ€νμ μμΈλ€.
νλ¨μ μ€νꡬ문μΌλ‘ μΈνμ¬ hi
ν¨μμ€ν 컨ν
μ€νΈκ° λ¨Όμ μ½μ€νμμ μ κ±°λλ€.
λ€μμΌλ‘ respond
ν¨μμ€ν 컨ν
μ€νΈκ° μ€ν ν μ½μ€νμμ μ κ±°λλ€.
respond
ν¨μ λ΄μ setTimeout
μ΄λΌλ WebApiκ° μ‘΄μ¬νλ―λ‘ λΈλΌμ°μ κ° μλ°μ€ν¬λ¦½νΈ μμ§κ³Ό λ€λ₯Έ μ€λ λμμ ν΄λΉ μμ²μ μ²λ¦¬νλ€.
Web Apiμμ setTimeout
μ μ§μ λ μκ°μ΄ μ§λ ν, μ λ¬λ μ½λ°±ν¨μλ Task Que
λ‘ μ λ¬λλ€. (μ½μ€νμΌλ‘ μ λ¬λμ§ μλκ²μ΄ ν΅μ¬μ΄λ€.)
μ΄ν λ§μ½ μ½μ€νμ΄ λΉμ΄μλ€λ©΄ ν΄λΉ ν¨μμ€ν 컨ν μ€νΈλ₯Ό μ½μ€νμΌλ‘ μ λ¬νκ³ λΉμ΄μμ§ μλ€λ©΄ μ λ¬νμ§ μλλ€.
μ½μ€νμ΄ λΉμ΄μμΌλ―λ‘ ν¨μλ₯Ό μ½μ€νμΌλ‘ μ λ¬ν ν κ²°κ³Ό μΆλ ₯μ΄νμ μ κ±°λλ€.
Web Api
, Task Que
κ°μ μλ‘μ΄ κ°λ
μ΄ λ±μ₯νμΌλ λ¨Όμ ν΄λΉ κ°λ
μ λν΄ κ³΅λΆν΄λ³΄μ
μμμμ λμ¨ setTimeout
μ ν¬ν¨νμ¬ Ajax
, Event Listener
μ²λΌ μΉλΈλΌμ°μ μμ μ 곡νλ κΈ°λ₯λ€μ μΌμ»«λλ€.
κ³Όμ μ€λͺ
μ ν΅ν΄ μΈκΈν κ²μ²λΌ μλ°μ€ν¬λ¦½νΈ μμ§μ μ½μ€νμμ λΉλκΈ° ν¨μκ° μ€νλλ κ²½μ°, ν΄λΉ ν¨μκ° μμ²νλ λΉλκΈ° μμ
μ 보μ μ½λ°±ν¨μλ₯Ό Web Apiλ₯Ό ν΅νμ¬ λΈλΌμ°μ μκ² μ λ¬νλ€. μ΄ν λΈλΌμ°μ λ μ λ¬λ°μ μμ²λ€μ λ³λμ μ€λ λμ μμν ν, μμ²μ΄ μλ£λ¨κ³Ό λμμ Task Que
μ μ λ¬νλ€.
νμ€ν¬νλ μΉ apiλ‘ λΆν° μ λ¬λ°μ μ½λ°±ν¨μλ€μ νμ ννλ‘ μ μ₯νλ€. μΉ apiμ λ¬λ¦¬ μλ°μ€ν¬λ¦½νΈ μμ§μ ν¬ν¨λμ΄ μμΌλ©°, μ μ₯λ ν¨μλ€μ μ½μ€νμ΄ λΉλ μκ° μ°¨λ‘λλ‘ μ λ¬λλ€. μ μν μ μ μ½μ€νμ΄ λΉμ΄μμλ μ λ¬λκΈ° λλ¬Έμ, μ§μ (μμ)ν μκ°λ³΄λ€ λ λ¦κ² μ€νλ μλ μλ€.
μ΄μ λ€μ μμμ½λμ λμκ³Όμ μ μ΄ν΄λ³΄μ.
μλ°μ€ν¬λ¦½νΈ μμ§μ Call Stack
κ³Ό Task Que
λ λ¨μΌμ€λ λλ‘ λμνλ μλ°μ€ν¬λ¦½νΈμ μμ
μ λ³λμ μ€λ λμμ μμ
ν μ μλλ‘ λμμ€λ€.
μ‘°κΈ λ μκ°ν΄λ³΄λ©΄ μ°λ¦¬λ μ½μ€νμ΄ λΉμ΄μλμ§, νμ€ν¬νμ ν¨μκ° μλμ§λ₯Ό μ§μμ μΌλ‘ νμΈμ ν΄μ£Όμ΄μΌ ν νμμ±μ΄ μλ€. νμΈμ μ§μμ μΌλ‘ ν΄μ£Όμ§ μλλ€λ©΄ νμ€ν¬νμ μλ ν¨μκ° μ½μ€νμ΄ λΉμ΄μμμλ λΆκ΅¬νκ³ μ λ¬λμ§ μμ μ€νλμ§ μμμ μκΈ° λλ¬Έμ΄λ€. μ¬μ©μ κ²½νμ λ§€μ° μ€μνλ λΈλΌμ°μ μμ μ΄λ¬ν νμμ μΉλͺ μ μΌ μ λ°μ μλ€.
μ΄ μν μ μνν΄ μ£Όλ κ²μ΄ λ°λ‘ Event Loopμ΄λ€. μ΄λ²€νΈλ£¨νλ μ½μ€νκ³Ό νμ€ν¬νλ₯Ό μ§μμ μΌλ‘ λ³΄κ³ μλ€κ° μ½μ€νμ΄ λΉμμ§λ μκ° νμ€ν¬νμ μλ μ½λ°±ν¨μλ₯Ό μ λ¬μν€λ μν μ νλ€.
μ 체μ μΈ νλ¦μμμ λμμ λ€μ νλ² μ΄ν΄λ³΄λ©΄
ν¨μ1, ν¨μ 2(setTimeout
)λ₯Ό Call Stack
μ μ½μ
ν¨μ1μ μ€ν ν μ κ±°
ν¨μ2μ setTimeout
μ΄ ν¬ν¨λμ΄ μμΌλ―λ‘ μ€νμμ μ κ±°νκ³ Web Api
λ‘ μ λ¬
Web Api
μμ μ€νλ κ²°κ³Όλ₯Ό Task Que
λ‘ μ λ¬
Event Loop
λ Call Stack
μ νμΈνκ³ λΉμ΄μμΌλ―λ‘ Task Que
β‘οΈ Call Stack
μΌλ‘ ν΄λΉ ν¨μ μ λ¬
μ€ν ν μ κ±°
μμ κ°μ λμκ³Όμ μ κ±°μΉλ κ²μ νμΈν μ μλ€.
곡λΆν λ΄μ©μ μ 리ν΄λ³΄μλ©΄
μλ°μ€ν¬λ¦½νΈλ λ¨μΌ μ½μ€νμ μ¬μ©νλ€λ μ μμ μ±κΈ μ€λ λ μΈμ΄λΌκ³ ν μ μλ€. νμ§λ§ μ€μ λ‘ μλ°μ€ν¬λ¦½νΈκ° μ¬μ©λλ νκ²½μΈ λΈλΌμ°μ λ Node jsμμλ μ¬λ¬κ°μ μ€λ λκ° μ¬μ©λλλ°, λ€μμ μ€λ λ νκ²½κ³Ό λ¨μΌ μ€λ λ μΈμ΄λ₯Ό μ°λνκΈ° μν΄μ Event Loopκ° μ¬μ©λλ€.
μ μ€λͺ λμ΄ μλ μμμ΄λΌκ³ μκ°λμ΄ λμ€μ λ€μ 보면μ 볡μ΅ν΄λ λ κ² κ°λ€.