반응형
fastapi에서 mongoDB를 연결해서 토큰을 생성해오는 작업중.
연결했다고 좋아하고 있었는데
두번째는 무조건 에러가 발생했다.
이벤트 루프가 닫혔다는 것.
File "C:\Users\kimaa\AppData\Local\Programs\Python\Python313\Lib\asyncio\base_events.py", line 556, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
그래서 몽고db가 중간에 끊겼나 싶었는데 그런것도 아니었다.
엄청난 삽질끝에
내가 controller에서 사용하던
인증정보를 불러오는 이 문구가 문제였다.
auth_data = asyncio.run(authenticate_user(request))
asyncio.run(authenticate_user(request))는
FastAPI 컨트롤러에서 직접 실행하는 건 추천되지 않는다고 한다.
이유는 FastAPI 자체가 비동기(Async) 프레임워크이기 때문에,
asyncio.run()을 사용하면 이벤트 루프 충돌이 발생할 수 있기 때문.
🔹 asyncio.run()을 사용하면 왜 문제가 될까?
⚠️ asyncio.run()의 동작 방식
- 새로운 이벤트 루프를 생성
- 기존 루프를 종료하고 강제로 실행
- 비동기 함수 실행 후, 다시 이벤트 루프 닫음
하지만 FastAPI는 이미 자체적인 비동기 이벤트 루프를 실행 중
그런데 asyncio.run()을 사용하면 기존 루프를 강제로 닫고 새로운 루프를 열어버리기 때문에 충돌이 발생할 수 있다.
🔹 🚀 올바른 방법: await 사용하기
FastAPI의
엔드포인트(컨트롤러) 함수는
기본적으로 async def로 선언해야 해.
그리고 비동기 함수를 실행할 때는 asyncio.run()이 아니라 await을 사용해야 해.
✅ 수정 코드
auth_data = await authenticate_user(request) # ✅ asyncio.run() 대신 await 사용
이렇게 하니깐 여러번 호출해도 이벤트 루프 클로즈 에러는 발생하지 않았다!!
모르면 삽질 ㅠㅠ
728x90
반응형
'Python' 카테고리의 다른 글
Python 프레임워크 및 라이브러리 선택 기준 정리 (0) | 2025.05.16 |
---|---|
비밀번호 암호화에 passlib와 hashlib 비교 (python) (0) | 2025.03.06 |
fastapi - bcrypt 오류 (0) | 2025.02.27 |
인텔리제이에서 파이썬 실행 환경 구성하기 (0) | 2025.02.25 |
유튜브 mp3음원 추출 (0) | 2025.02.22 |