<aside>

</aside>

μ•ˆλ…•ν•˜μ„Έμš”! FastAPI 7λΆ€ '비동기 처리 및 μ„±λŠ₯ μ΅œμ ν™”'의 두 번째 μ‹œκ°„, 33κ°•μž…λ‹ˆλ‹€! ⚑

μ§€λ‚œ 32κ°•μ—μ„œλŠ” FastAPI의 λ†€λΌμš΄ μ„±λŠ₯ 비결인 비동기(Asynchronous) λ™μž‘ 원리에 λŒ€ν•΄ 깊이 νŒŒκ³ λ“€μ—ˆμŠ΅λ‹ˆλ‹€. 이벀트 루프, async def, await ν‚€μ›Œλ“œκ°€ μ–΄λ–»κ²Œ λ…ΌλΈ”λ‘œν‚Ή I/Oλ₯Ό 톡해 높은 λ™μ‹œμ„±μ„ λ‹¬μ„±ν•˜λŠ”μ§€ μ΄ν•΄ν–ˆμ£ ! πŸ‘

ν•˜μ§€λ§Œ κ°•λ ₯ν•œ 만큼 μ£Όμ˜ν•  점도 μžˆμŠ΅λ‹ˆλ‹€. async def둜 비동기 ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄ 놓고, κ·Έ μ•ˆμ—μ„œ μ‹€μˆ˜λ‘œ 동기(Synchronous) λ°©μ‹μ˜ λΈ”λ‘œν‚Ή(Blocking) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”? 예λ₯Ό λ“€μ–΄, await 없이 μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ ν˜ΈμΆœν•˜κ±°λ‚˜, time.sleep() 같은 ν•¨μˆ˜λ₯Ό 직접 μ‚¬μš©ν•œλ‹€λ©΄μš”? πŸ€”

이번 μ‹œκ°„μ—λŠ” λ°”λ‘œ 이 비동기 μ½”λ“œ 속 λΈ”λ‘œν‚Ή μž‘μ—…μ˜ 함정에 λŒ€ν•΄ μ•Œμ•„λ΄…λ‹ˆλ‹€. 이벀트 루프λ₯Ό λ©ˆμΆ”κ²Œ ν•˜λŠ” λΈ”λ‘œν‚Ή μ½”λ“œκ°€ μ™œ μ„±λŠ₯에 치λͺ…적인지, μ–΄λ–€ μ½”λ“œλ“€μ΄ λΈ”λ‘œν‚Ήμ„ μœ λ°œν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ³ , λΆˆκ°€ν”Όν•˜κ²Œ λΈ”λ‘œν‚Ή μ½”λ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  경우 FastAPI의 비동기 μ„±λŠ₯을 ν•΄μΉ˜μ§€ μ•Šκ³  μ•ˆμ „ν•˜κ²Œ μ‹€ν–‰ν•˜λŠ” 방법(asyncio.to_thread λ“±)을 λ°°μš°κ² μŠ΅λ‹ˆλ‹€! 비동기 ν”„λ‘œκ·Έλž˜λ°μ˜ 잠재적인 μœ„ν—˜μ„ ν”Όν•˜κ³  μ„±λŠ₯을 μœ μ§€ν•˜λŠ” 방법을 μ•Œμ•„λ΄…μ‹œλ‹€! ⚠️


πŸ“š 챕터 μ†Œκ°œ

FastAPI 비동기 ν™˜κ²½μ—μ„œ λΈ”λ‘œν‚Ή(Blocking) μž‘μ—…μ˜ 잘λͺ»λœ μ‚¬μš© μ‹œ 문제점 및 ν•΄κ²° λ°©μ•ˆ ν•™μŠ΅. FastAPI의 μ„±λŠ₯은 이벀트 루프가 λ©ˆμΆ”μ§€ μ•Šκ³  계속 λŒλ©΄μ„œ μ—¬λŸ¬ μž‘μ—…μ„ 효율적으둜 μ „ν™˜(Context Switching)ν•˜λŠ” λŠ₯λ ₯에 크게 의쑴. ν•˜μ§€λ§Œ async def둜 μ •μ˜λœ ν•¨μˆ˜ λ‚΄μ—μ„œ λΈ”λ‘œν‚Ή I/O ν˜ΈμΆœμ΄λ‚˜ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” CPU μž‘μ—…μ„ await 없이 직접 μ‹€ν–‰ν•˜λ©΄, 이벀트 루프 전체가 λ©ˆμΆ°λ²„λ € 비동기 처리의 이점을 μ™„μ „νžˆ μƒμ‹€ν•˜κ²Œ 됨.

이벀트 루프λ₯Ό λΈ”λ‘œν‚Ήν•˜λŠ” μ½”λ“œ(예: time.sleep(), 동기 라이브러리 호좜, CPU 집약적 계산) 식별 방법 ν•™μŠ΅. 이것이 λ™μ‹œμ„±κ³Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 응닡성에 λ―ΈμΉ˜λŠ” μ‹¬κ°ν•œ 영ν–₯ μ„€λͺ….

핡심 ν•΄κ²°μ±…μœΌλ‘œ, Python 3.9 μ΄μƒμ—μ„œ ν‘œμ€€μœΌλ‘œ μ œκ³΅λ˜λŠ” asyncio.to_thread ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λΈ”λ‘œν‚Ή ν•¨μˆ˜λ₯Ό λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰μ‹œμΌœ 이벀트 λ£¨ν”„μ˜ 쀑단을 λ°©μ§€ν•˜λŠ” 방법을 μ‹€μŠ΅. λ˜ν•œ, Starlette의 μœ μ‚¬ κΈ°λŠ₯(run_in_threadpool)도 κ°„λž΅νžˆ μ†Œκ°œν•˜λ©°, κ°€μž₯ 쒋은 방법은 μ—¬μ „νžˆ λ„€μ΄ν‹°λΈŒ 비동기(async) 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž„μ„ λ‹€μ‹œ ν•œλ²ˆ κ°•μ‘°.


🎯 챕터 λͺ©ν‘œ

이 κ°•μ˜λ₯Ό 마치면 μ—¬λŸ¬λΆ„μ€ λ‹€μŒμ„ ν•  수 있게 λ©λ‹ˆλ‹€:

  1. async def ν•¨μˆ˜ λ‚΄ λΈ”λ‘œν‚Ή μž‘μ—… 직접 호좜이 FastAPI의 μ„±λŠ₯κ³Ό λ™μ‹œμ„±μ„ μ €ν•΄ν•˜λŠ” 이유 μ„€λͺ….
  2. 일반적인 λΈ”λ‘œν‚Ή μž‘μ—…(동기 I/O, time.sleep(), CPU μ§‘μ•½ μž‘μ—…) μ˜ˆμ‹œ 식별.
  3. λΈ”λ‘œν‚Ή μ½”λ“œλ₯Ό 비동기 ν™˜κ²½μ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ asyncio.to_thread ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•˜κ³  awaitν•˜λŠ” 방법.
  4. (μ°Έκ³ ) Starlette의 run_in_threadpool ν•¨μˆ˜μ˜ μ‘΄μž¬μ™€ μš©λ„ 이해.
  5. κ°€λŠ₯ν•˜λ‹€λ©΄ λΈ”λ‘œν‚Ή μž‘μ—…μ„ ν”Όν•˜κ³  λ„€μ΄ν‹°λΈŒ 비동기 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ 쒋은 ν•΄κ²°μ±…μž„μ„ 인지.

πŸ—οΈ 이번 κ°•μ˜μ˜ ν”„λ‘œμ νŠΈ ꡬ쑰 및 예제 μ½”λ“œ (κ°œλ… ν•™μŠ΅μš©)