<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) λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μμ λ€μ νλ² κ°μ‘°.
μ΄ κ°μλ₯Ό λ§μΉλ©΄ μ¬λ¬λΆμ λ€μμ ν μ μκ² λ©λλ€:
async def
ν¨μ λ΄ λΈλ‘νΉ μμ
μ§μ νΈμΆμ΄ FastAPIμ μ±λ₯κ³Ό λμμ±μ μ ν΄νλ μ΄μ μ€λͺ
.time.sleep()
, CPU μ§μ½ μμ
) μμ μλ³.asyncio.to_thread
ν¨μλ₯Ό μ¬μ©νμ¬ λ³λμ μ€λ λμμ μ€ννκ³ await
νλ λ°©λ².run_in_threadpool
ν¨μμ μ‘΄μ¬μ μ©λ μ΄ν΄.