๐ฐ FastAPI ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๊ฐ์ธ์ ์ผ๋ก ์ ๋ฆฌํ ๊ธ ์
๋๋ค.
๋น๋๊ธฐ ์ฝ๋๋?
ํ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ ์ฝ๋
์ ํต์ ์ธ ๋๊ธฐ ์ฝ๋๋ ํ ์์ ์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ ์ ์ํํ์ง๋ง ๋น๋๊ธฐ๋ ๊ทธ ๋ฐ๋์ด๋ค.
๋น๋๊ธฐ ์ฝ๋๋ ์ฃผ๋ก I/O ์์ (๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ ์ถ๋ ฅ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๋ฑ)์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์ด๋ฐ I/O ์์ ๋ค์ ํน์ง์ ์๋ฃ ๊น์ง ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์์ด, ๋๊ธฐ ์ฒ๋ฆฌ ์ ๋ค๋ฅธ ์์ ์ ๋ง๊ณ ๋๊ธฐํด์ผ ํ๋ ๋ฉ๋จธ์ด ์๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์ฝ๋ ์ฒ๋ฆฌํ์ฌ ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ์ ์๋ค.
ํ์ด์ฌ์์๋ async/await ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
async : ๋น๋๊ธฐ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ
await : ๋น๋๊ธฐ ํจ์ ๋ด์์ ๋ค๋ฅธ ๋น๋๊ธฐ ์์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ ์ฌ์ฉ
๋น๋๊ธฐ ํจ์ ํธ์ถ์ ์์ ์ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ, await ํค์๋๋ฅผ ๋ง๋๋ฉด ์คํ์ ์ผ์ ์ค๋จํ๊ณ ๋ค๋ฅธ ์์ ์ ์ฒ๋ฆฌํ ๋ค, ํด๋น ์์ ์ด ์๋ฃ๋๋ฉด ๋ค์ ์คํ๋๋ค.
๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์ฝ๋์ ์์ฑ์ ๋๊ธฐ ์ฝ๋๋ณด๋ค ๋ณต์กํ ์ ์๊ณ , ์ ์ ํ ์ฌ์ฉ ๋ฐ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
๋น๋๊ธฐ๋ ๋ณ๋ ฌ๊ณผ ๋น์ทํด๋ณด์ด์ง๋ง ์ฐจ์ด์ ์ด ์๋ค.
๋น๋๊ธฐ : ์์ ๋ค์ ์์ ๋จ์๋ก ๋๋์ด ๋ฒ๊ฐ์๊ฐ๋ฉฐ ์คํ, ์์ ๊ฐ์ ์ ํ์ ๋น ๋ฅด๊ฒ ์ํํ์ฌ ์ฌ๋ฌ ์์ ์ด ๋์์ ์งํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์.
๋ณ๋ ฌ : ์ฌ๋ฌ๊ฐ์ CPU ์ฝ์ด ๋๋ ์ปดํจํฐ ์์คํ ์ ๋ค์ค ํ๋ก์ธ์ฑ ํ๊ฒฝ์ ํ์ฉํ์ฌ ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌ.
๋์์ฑ + ๋ณ๋ ฌ์ฑ -> ์น + ๋จธ์ ๋ฌ๋
- FastAPI๋ฅผ ์ฌ์ฉํ๋ฉด ๋จธ์ ๋ฌ๋ ์์คํ ๊ณผ ๊ฐ์ด CPU/GPU์ ๋ฌถ์ธ ์์ ์ ์ํด ๋ณ๋ ฌ์ฑ๊ณผ ๋ฉํฐํ๋ก์ธ์ฑ์ ์ด์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- ๋ฐ์ดํฐ์ฌ์ด์ธ์ค / ๋จธ์ ๋ฌ๋์ ์ฌ์ฉํ์ฌ ์น API์ ์์ฉํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋ ์ข์ ์ ํ์ง
async / await
await์ ๋น๋๊ธฐ ํจ์ ๋ด์์ ๋ค๋ฅธ ๋น๋๊ธฐ ํจ์์ ์คํ์ ๊ธฐ๋ค๋ฆฌ๋ ํค์๋์ด๋ค.
๋น๋๊ธฐ ํจ์๋ async๋ก ๋น๋๊ธฐ ํจ์๋ฅผ ์ ์ํด์ผ ํ๋ค.
import asyncio
async def async_func():
print("๋น๋๊ธฐ ํจ์ ์์")
await asyncio.sleep(1) # 1์ด ๋๊ธฐ
print("๋น๋๊ธฐ ํจ์ ์ข
๋ฃ")
async def main():
print("๋ฉ์ธ ํจ์ ์์")
await async_func() # async_func()์ ์คํ์ ๋๊ธฐ
print("๋ฉ์ธ ํจ์ ์์")
asyncio.run(main()) # ๋น๋๊ธฐ ํจ์ ์คํ
FastAPI์์ ํ ์คํธ
from fastapi.testclient import TestClient
from fastapi import FastAPI
import asyncio
app = FastAPI()
async def async_operation():
# ๋น๋๊ธฐ ์์
์ ์ํํ๋ ํจ์
await asyncio.sleep(1) # 1์ด ๋์ ๋๊ธฐ
return {"message": "๋น๋๊ธฐ ์์
์๋ฃ"}
@app.get("/")
async def root():
# ๋น๋๊ธฐ ์์
์ ํธ์ถํ๋ ํธ๋ค๋ฌ ํจ์
result = await async_operation()
return result
# ํ
์คํธ์ฉ ์ฝ๋
def test_root():
client = TestClient(app)
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "๋น๋๊ธฐ ์์
์๋ฃ"}
'Back-end & Server > FastAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FastAPI] Form (0) | 2024.02.20 |
---|---|
[FastAPI] ๋ชจ๋ธ (0) | 2024.02.20 |
[FastAPI] ๋งค๊ฐ๋ณ์ (0) | 2024.02.20 |
[FastAPI] ํ์ ์ง์ , Pydantic (0) | 2024.02.19 |
[FastAPI] ๊ฐ์ (0) | 2024.02.19 |