Skip to content

Latest commit

Β 

History

History
170 lines (117 loc) Β· 6.04 KB

File metadata and controls

170 lines (117 loc) Β· 6.04 KB

42μž₯ 비동기 ν”„λ‘œκ·Έλž˜λ°

42.1 동기 μ²˜λ¦¬μ™€ 비동기 처리

πŸ€” ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ

  • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•¨μˆ˜ μ½”λ“œκ°€ ν‰κ°€λ˜μ–΄ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ©λ‹ˆλ‹€. μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ(= 콜 μŠ€νƒ)에 ν‘Έμ‰¬λ˜κ³  ν•¨μˆ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • μ‹€ν–‰ μ’…λ£Œμ‹œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ—μ„œ νŒλ˜μ–΄ μ œκ±°λ©λ‹ˆλ‹€.

42-01

42-01 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ

const foo = () => {};
const bar = () => {};

foo();
bar();

βœ… μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 단 ν•˜λ‚˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ κ°€μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ, λ™μ‹œμ— 2개 μ΄μƒμ˜ ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

βœ… μ‹±κΈ€ μŠ€λ ˆλ“œ λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μ²˜λ¦¬μ— μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” taskλ₯Ό μ‹€ν–‰ν•˜λŠ” 경우 λΈ”λ‘œν‚Ή(μž‘μ—… 쀑단) 이 λ°œμƒλ©λ‹ˆλ‹€.

42-02

// sleep ν•¨μˆ˜λŠ” 일정 μ‹œκ°„(delay)이 κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜(func)λ₯Ό ν˜ΈμΆœν•œλ‹€.
function sleep(func, delay) {
  const delayUntil = Date.now() + delay;

  // ν˜„μž¬ μ‹œκ°„(Date.now())에 delayλ₯Ό λ”ν•œ delayUntil이 ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ μž‘μœΌλ©΄ 계속 λ°˜λ³΅ν•œλ‹€.
  while (Date.now() < delayUntil);
  // 일정 μ‹œκ°„(delay)이 κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜(func)λ₯Ό ν˜ΈμΆœν•œλ‹€.
  func();
}

function foo() {
  console.log("foo");
}
function bar() {
  console.log("bar");
}

// sleep ν•¨μˆ˜λŠ” 3초 이상 μ‹€ν–‰λœλ‹€.
sleep(foo, 3 * 1000);
// bar ν•¨μˆ˜λŠ” sleep ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ 이후에 ν˜ΈμΆœλ˜λ―€λ‘œ 3초 이상 λΈ”λ‘œν‚Ήλœλ‹€.
bar();
// (3초 κ²½κ³Ό ν›„) foo 호좜 -> bar 호좜

πŸ˜€ 동기 처리 (synchronous)

  • ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œν•  λ•ŒκΉŒμ§€ λ‹€μŒμ— 싀행될 νƒœμŠ€ν¬κ°€ λŒ€κΈ°ν•˜λŠ” 방식
  • μ‹€ν–‰ μˆœμ„œλŠ” 보μž₯λ˜μ§€λ§Œ, μ•žμ„  νƒœμŠ€ν¬κ°€ μ’…λ£Œλ  λ•ŒκΉŒμ§€ 이후 νƒœμŠ€ν¬λ“€μ΄ λΈ”λ‘œν‚Ήλ©λ‹ˆλ‹€.

πŸ€” 비동기 처리

  • ν˜„μž¬ μ‹€ν–‰ 쀑인 νƒœμŠ€ν¬κ°€ μ’…λ£Œλ˜μ§€ μ•ŠλŠ” μƒνƒœλΌλ„ λ‹€μŒ νƒœμŠ€ν¬λ₯Ό κ³§λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” 방식
  • μ‹€ν–‰ μˆœμ„œλŠ” 보μž₯λ˜μ§€ μ•Šμ§€λ§Œ, λΈ”λ‘œν‚Ήμ΄ λ°œμƒλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • setTimeout, setInterval, HTTP μš”μ²­, 이벀트 ν•Έλ“€λŸ¬
  • 콜백 νŒ¨ν„΄μ˜ λ¬Έμ œμ„± -> 45절 ν”„λ‘œλ―ΈμŠ€

42-03

function foo() {
  console.log("foo");
}
function bar() {
  console.log("bar");
}

// 타이머 ν•¨μˆ˜ setTimeout은 일정 μ‹œκ°„μ΄ κ²½κ³Όν•œ 이후에 콜백 ν•¨μˆ˜ fooλ₯Ό ν˜ΈμΆœν•œλ‹€.
// 타이머 ν•¨μˆ˜ setTimeout은 bar ν•¨μˆ˜λ₯Ό λΈ”λ‘œν‚Ήν•˜μ§€ μ•ŠλŠ”λ‹€.
setTimeout(foo, 3 * 1000);
bar();
// bar 호좜 -> (3초 κ²½κ³Ό ν›„) foo 호좜

42.2 이벀트 루프와 νƒœμŠ€ν¬ 큐

λΈŒλΌμš°μ €κ°€ λ™μž‘μ‹œ ν…ŒμŠ€ν¬κ°€ λ™μ‹œμ— μ²˜λ¦¬λ˜λŠ” κ²ƒμ²˜λŸΌ λŠκ»΄μ§‘λ‹ˆλ‹€. πŸ˜€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ™μ‹œμ„±μ„ 지원 ν•˜λŠ” 이벀트 루프

42-4

πŸ€” 콜 μŠ€νƒ

  • μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒ
  • μƒμ„±λœ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μΆ”κ°€λ˜κ³  μ œκ±°λ˜λŠ” μŠ€νƒ 자료ꡬ쑰λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

πŸ€” νž™

  • 객체가 μ €μž₯λ˜λŠ” λ©”λͺ¨λ¦¬ 곡간
  • 비ꡬ쑰화 : ν• λ‹Ήν•΄μ•Όν•  λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기λ₯Ό λŸ°νƒ€μž„μ— κ²°μ •(동적할당)ν•©λ‹ˆλ‹€.

비동기 μ²˜λ¦¬μ—μ„œ μ†ŒμŠ€μ½”λ“œ 평가와 μ‹€ν–‰ μ™Έμ—λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진을 κ΅¬λ™ν•˜λŠ” ν™˜κ²½μΈ λΈŒλΌμš°μ € λ˜λŠ” Node.jsκ°€ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

βœ… 이λ₯Ό μœ„ν•΄ νƒœμŠ€ν¬ 큐와 이벀트 루프λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

πŸ€” ν…ŒμŠ€νŠΈ 큐

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

πŸ€” 이벀트 루프

  • 콜 μŠ€νƒμ— ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈμ™€ νƒœμŠ€ν¬ 큐에 λŒ€κΈ°μ€‘μΈ ν•¨μˆ˜ 유무λ₯Ό λ°˜λ³΅ν•΄μ„œ ν™•μΈν•˜λŠ” μ—­ν• .
  • 콜 μŠ€νƒμ΄ λΉ„μ–΄ 있고 νƒœμŠ€ν¬ 큐에 λŒ€κΈ°μ€‘μΈ ν•¨μˆ˜κ°€ μžˆμ„ μ‹œ 순차적(FIFO)으둜 μ΄λ™ν•©λ‹ˆλ‹€.

42-04

function foo() {
  console.log("foo");
}

function bar() {
  console.log("bar");
}

setTimeout(foo, 0); // 0초(μ‹€μ œλŠ” 4ms) 후에 foo ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.
bar();
  1. μ „μ—­ μ½”λ“œκ°€ ν‰κ°€λ˜μ–΄ μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  콜 μŠ€νƒμ— ν‘Έμ‰¬λ©λ‹ˆλ‹€.

  1. μ „μ—­ μ½”λ“œ μ‹€ν–‰μ‹œ setTimeout ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μ΄λ•Œ setTimeout ν•¨μˆ˜μ˜ ν•¨μˆ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  μ½œμŠ€νƒμ— ν‘Έμ‰¬λ˜μ–΄ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ©λ‹ˆλ‹€. πŸ˜€ λΈŒλΌμš°μ € μ—­ν• : μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ 생성

  1. setTimeout μ‹€ν–‰μ‹œ 콜백 ν•¨μˆ˜λ₯Ό 호좜 μŠ€μΌ€μ€„λ§ ν›„ μ’…λ£Œλ˜μ–΄ 콜 μŠ€νƒμ—μ„œ νŒλ©λ‹ˆλ‹€. πŸ˜€ λΈŒλΌμš°μ € μ—­ν• : 타이머 μ„€μ •κ³Ό 타이머 λ§Œλ£Œμ‹œ 콜백 ν•¨μˆ˜λ₯Ό νƒœμŠ€ν¬ 큐에 푸쉬

  1. λ‹€μŒ 과정이 병행 처리 λ©λ‹ˆλ‹€. (νƒœμŠ€νŠΈ 큐)
    1. μ§€μ—° μ‹œκ°„μ΄ 4ms μ΄ν•˜μΈ 경우 μ΅œμ†Œ μ§€μ—° μ‹œκ°„ 4ms이 μ§€μ •λ˜μ–΄, 4ms 후에 콜백 ν•¨μˆ˜ fooκ°€ νƒœμŠ€ν¬ 큐에 ν‘Έμ‰¬λ˜μ–΄ λŒ€κΈ° . 이후 콜 μŠ€νƒμ΄ λΉ„λ©΄ 호좜 πŸ˜€ λΈŒλΌμš°μ € μ—­ν• : 타이머 μ„€μ •, 타이머 만료 λŒ€κΈ°
    2. bar ν•¨μˆ˜ ν˜ΈμΆœλ˜μ–΄ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ μƒμ„±λ˜κ³  콜 μŠ€νƒμ— ν‘Έμ‰¬λ˜μ–΄ ν˜„μž¬ μ‹€ν–‰ 쀑인 μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ λ©λ‹ˆλ‹€. 이후 μ’…λ£Œμ‹œ 콜 μŠ€νƒμ—μ„œ νŒλ©λ‹ˆλ‹€. πŸ˜€ λΈŒλΌμš°μ €κ°€ 타이머λ₯Ό μ„€μ •ν•œ ν›„ 4msκ°€ κ²½κ³Όλ˜μ—ˆλ‹€λ©΄ foo ν•¨μˆ˜λŠ” 아직 νƒœμŠ€ν¬ νμ—μ„œ λŒ€κΈ° 쀑 μž…λ‹ˆλ‹€.

  1. μ „μ—­ μ½”λ“œ 싀행이 μ’…λ£Œλ˜κ³  μ „μ—­ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈκ°€ 콜 μŠ€νƒμ—μ„œ νŒλ©λ‹ˆλ‹€.

βœ… 비동기 ν•¨μˆ˜λŠ” νƒœμŠ€ν¬ 큐에 ν‘Έμ‰¬λ˜μ–΄ λŒ€κΈ° ν•˜λ‹€ 콜 μŠ€νƒμ΄ λΉ„κ²Œ 되면, μ „μ—­ μ½”λ“œ 및 λͺ…μ‹œμ μœΌλ‘œ 호좜된 ν•¨μˆ˜κ°€ λͺ¨λ‘ μ’…λ£Œλ˜λ©΄ 콜 μŠ€νƒμ— ν‘Έμ‰¬λ˜μ–΄ μ‹€ν–‰ λ©λ‹ˆλ‹€.

βœ… μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ λ™μž‘ ν•˜μ§€λ§Œ λΈŒλΌμš°μ €λŠ” λ©€ν‹° μŠ€λ ˆλ“œλ‘œ λ™μž‘ ν•©λ‹ˆλ‹€.