Python

fastapi - Event loop is closed 에러

ZZJJing 2025. 3. 4. 15:53
반응형

 

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()의 동작 방식

  1. 새로운 이벤트 루프를 생성
  2. 기존 루프를 종료하고 강제로 실행
  3. 비동기 함수 실행 후, 다시 이벤트 루프 닫음

하지만 FastAPI는 이미 자체적인 비동기 이벤트 루프를 실행 중
그런데 asyncio.run()을 사용하면 기존 루프를 강제로 닫고 새로운 루프를 열어버리기 때문에 충돌이 발생할 수 있다.


🔹 🚀 올바른 방법: await 사용하기

FastAPI의

엔드포인트(컨트롤러) 함수는

기본적으로 async def로 선언해야 해.
그리고 비동기 함수를 실행할 때는 asyncio.run()이 아니라 await을 사용해야 해.

수정 코드

auth_data = await authenticate_user(request)  # ✅ asyncio.run() 대신 await 사용

이렇게 하니깐 여러번 호출해도 이벤트 루프 클로즈 에러는 발생하지 않았다!!

 

모르면 삽질 ㅠㅠ 

728x90
반응형