MCPcopy
hub / github.com/encode/uvicorn / shutdown

Method shutdown

uvicorn/server.py:271–301  ·  view source on GitHub ↗
(self, sockets: list[socket.socket] | None = None)

Source from the content-addressed store, hash-verified

269 return False
270
271 async def shutdown(self, sockets: list[socket.socket] | None = None) -> None:
272 logger.info("Shutting down")
273
274 # Stop accepting new connections.
275 for server in self.servers:
276 server.close()
277 for sock in sockets or []:
278 sock.close() # pragma: full coverage
279
280 # Request shutdown on all existing connections.
281 for connection in list(self.server_state.connections):
282 connection.shutdown()
283 await asyncio.sleep(0.1)
284
285 # When 3.10 is not supported anymore, use `async with asyncio.timeout(...):`.
286 try:
287 await asyncio.wait_for(
288 self._wait_tasks_to_complete(),
289 timeout=self.config.timeout_graceful_shutdown,
290 )
291 except asyncio.TimeoutError:
292 logger.error(
293 "Cancel %s running task(s), timeout graceful shutdown exceeded",
294 len(self.server_state.tasks),
295 )
296 for t in self.server_state.tasks:
297 t.cancel(msg="Task cancelled, timeout graceful shutdown exceeded")
298
299 # Send the lifespan shutdown event, and wait for application shutdown.
300 if not self.force_exit:
301 await self.lifespan.shutdown()
302
303 async def _wait_tasks_to_complete(self) -> None:
304 # Wait for existing connections to finish sending responses.

Callers 3

_serveMethod · 0.95
run_serverFunction · 0.95
startupMethod · 0.45

Calls 3

closeMethod · 0.45
cancelMethod · 0.45

Tested by

no test coverage detected