๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Back-end & Server/FastAPI

[FastAPI] ๋™์‹œ์„ฑ๊ณผ async / await

728x90
๋ฐ˜์‘ํ˜•

๐Ÿฐ 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": "๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ"}

 

728x90
๋ฐ˜์‘ํ˜•

'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