소스코드
from fastapi import FastAPI
import time
import asyncio
from datetime import datetime
app = FastAPI()
sem = asyncio.Semaphore(3) # 최대 동시처리 가능 개수 제한
@app.get("/")
def root():
print("/", datetime.now())
return {"date_time": datetime.now()}
@app.get("/time-sleep")
def time_sleep():
start_time = datetime.now()
results = time.sleep(6)
end_time = datetime.now()
return {"start_time":start_time, "end_time":end_time, "results":results}
@app.get("/async")
async def async_root():
print("/async", datetime.now())
return {"date_time": datetime.now()}
async def _async_sleep(num, sec): # time sleep 은 I/O bound 작업을 테스트할 때 사용
async with sem:
print("start sleep", datetime.now())
await asyncio.sleep(sec)
print("end sleep", datetime.now())
return f"hehe {num}"
async def task_in_parallel():
# 여러 개의 비동기 작업을 동시에 실행
results = await asyncio.gather(
asyncio.create_task(_async_sleep(1,6)),
asyncio.create_task(_async_sleep(2,6)),
asyncio.create_task(_async_sleep(3,6)),
asyncio.create_task(_async_sleep(4,6)),
asyncio.create_task(_async_sleep(5,6)),
)
return results
@app.get("/async-asyncio-sleep")
async def parallel_sleep():
start_time = datetime.now()
results = await task_in_parallel()
end_time = datetime.now()
return {"start_time":start_time, "end_time":end_time, "results":results}
@app.get("/async-sleep")
async def async_sleep():
start_time = datetime.now()
results = await _async_sleep(1,6)
end_time = datetime.now()
return {"start_time":start_time, "end_time":end_time, "results":results}
@app.get("/asyncio-sleep")
async def asyncio_sleep():
start_time = datetime.now()
results = await asyncio.sleep(6)
end_time = datetime.now()
return {"start_time":start_time, "end_time":end_time, "results":results}
- 앱 띄우는 방법 : uvicorn main:app --port 8000
- 브라우저에서 스웨거 접속하는 방법 : http://localhost:8000/docs
- 동시처리 API 응답 : async-asyncio-sleep API 호출 시 6초짜리 time sleep 함수 5개를 3개 / 2개 비동기처리하여 약 12초만에 응답 받음
{
"start_time": "2024-02-26T22:36:15.098960",
"end_time": "2024-02-26T22:36:27.101120",
"results": [
"hehe 1",
"hehe 2",
"hehe 3",
"hehe 4",
"hehe 5"
]
}
- 비동기처리 앱 로그 : async-asyncio-sleep API 처리 중 다른 API 요청 처리됨
INFO: Application startup complete.
start sleep 2024-02-26 22:46:12.735016
start sleep 2024-02-26 22:46:12.735016
start sleep 2024-02-26 22:46:12.736013
/async 2024-02-26 22:46:14.222185
INFO: 127.0.0.1:55682 - "GET /async HTTP/1.1" 200 OK
/ 2024-02-26 22:46:16.353565
INFO: 127.0.0.1:55682 - "GET / HTTP/1.1" 200 OK
end sleep 2024-02-26 22:46:18.739985
end sleep 2024-02-26 22:46:18.740557
end sleep 2024-02-26 22:46:18.741149
start sleep 2024-02-26 22:46:18.741675
start sleep 2024-02-26 22:46:18.741675
/async 2024-02-26 22:46:20.443945
INFO: 127.0.0.1:55682 - "GET /async HTTP/1.1" 200 OK
/ 2024-02-26 22:46:23.335636
INFO: 127.0.0.1:55682 - "GET / HTTP/1.1" 200 OK
end sleep 2024-02-26 22:46:24.738253
end sleep 2024-02-26 22:46:24.738253
INFO: 127.0.0.1:55681 - "GET /async-asyncio-sleep HTTP/1.1" 200 OK
참고 : 개발환경 라이브러리 버전
annotated-types==0.6.0
anyio==4.3.0
click==8.1.7
colorama==0.4.6
fastapi==0.110.0
h11==0.14.0
idna==3.6
pydantic==2.6.2
pydantic_core==2.16.3
sniffio==1.3.1
starlette==0.36.3
typing_extensions==4.10.0
uvicorn==0.27.1