사이드 프로젝트로 API 서버를 만들고 있는데, 특정 엔드포인트에서 외부 API를 호출하는 로직을 추가했습니다. 그런데 요청이 몰리면 서버 전체가 멈춘 것처럼 응답 속도가 급격히 느려지는데 왜 이러는지 모르겠어요.
코드:
from fastapi import FastAPI
import time
import requests
app = FastAPI()
@app.get("/slow")
async def slow_endpoint():
# 외부 API 호출을 가정
response = requests.get("https://httpbin.org/delay/3")
return {"message": "done"}
@app.get("/fast")
async def fast_endpoint():
return {"message": "fast"}
오류: /slow 엔드포인트에 요청을 여러 개 보내면, 아무런 연산이 없는 /fast 엔드포인트의 응답까지 같이 수 초 이상 대기 상태가 됨.
시도: requests 대신 httpx를 써보려고 했는데 설정이 복잡해서 일단 requests로 테스트 중이고, 서버 워커 수를 늘려봤지만 근본적인 해결이 안 되는 것 같습니다.
질문: async def로 정의한 함수 안에서 requests 같은 동기 라이브러리를 사용하면 이벤트 루프가 차단되어 다른 요청까지 영향을 주는 게 맞나요?
댓글5
-
빗방울
2026.10.30 10:01
-
빗방울
2026.10.30 11:05
ㄹㅇㅋㅋ
근데 httpx 생각보다 안 어려운데 한번 써보셈
비동기로 짜야 나중에 확장성 좋음
-
빗방울
2026.10.30 11:23
이거 초보자들이 진짜 많이 하는 실수임ㅋㅋ run_in_threadpool 같은 거 써서 분리하는 방법도 있는데 일단은 def로 바꾸는 게 제일 빠를 듯요.
-
빗방울
2026.10.30 11:37
맞음ㅋㅋ 특히 async def 썼다고 다 빨라지는 줄 아는 분들 많은 듯요. 그냥 def로 바꾸는 게 가성비 제일 좋죠.
-
빗방울
2026.10.30 11:43
ㄹㅇㅋㅋ run_in_threadpool까지 알면 이미 초보 탈출인데 그냥 def가 짱 편하긴 함ㅋㅋ
모든 이야기1464
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
정답임.
그냥 def로 선언하면 FastAPI가 알아서 외부 스레드 풀에서 돌려줘서 해결될 듯요.
아니면 그냥 httpx 쓰시는 게 정신건강에 이로움ㅋㅋ