Uvicorn 을 다시 시작하면 생기는 일
아무 조치도 하지 않으면 다시 시작할 때 모든 WebSocket 연결이 비정상 종료 코드 1006 으로 끝나. 클라이언트는 네트워크 오류를 보고 재연결 로직을 실행하니 작동은 해. 하지만 더 잘할 수 있어. 먼저 system.reconnect 메시지로 알리고 1001 ‘going away’ 코드로 깔끔하게 닫는 거야.
FastAPI lifespan
lifespan 컨텍스트 관리자를 사용해. yield 뒤에서 실행되는 모든 코드가 종료 단계야. 활성 WebSocket 을 모두 닫은 뒤 반환하면 되고, Uvicorn 은 lifespan 이 반환될 때까지 프로세스를 끝내지 않아.
gather 로 동시에 닫기
연결 10,000개를 하나씩 닫으면 몇 분이 걸릴 수 있어. asyncio.gather(*close_tasks, return_exceptions=True) 로 닫기 작업을 한꺼번에 시작하고 함께 기다려. return_exceptions=True 는 문제가 있는 클라이언트 하나 때문에 나머지 작업까지 중단되는 것을 막아.