From 2782d162efade1150f7df15d77b48083e77fdbc0 Mon Sep 17 00:00:00 2001 From: Alexey Ivanov Date: Fri, 16 Jun 2023 16:34:38 -0700 Subject: [PATCH] Improve shutdown process in Multiprocess mode Explicitly clos listening sockets in both parent and child processes early in the shutdown process. That way, no new connections can hit workers after shutdown is initiated by the parent process. While here, speedup shutdown by splitting process shutdown into terminate and join loop, so all processes are shutdown in parallel. --- uvicorn/server.py | 4 ++-- uvicorn/supervisors/multiprocess.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/uvicorn/server.py b/uvicorn/server.py index 94add91ae5..16a5d9dae1 100644 --- a/uvicorn/server.py +++ b/uvicorn/server.py @@ -265,10 +265,10 @@ async def shutdown(self, sockets: Optional[List[socket.socket]] = None) -> None: logger.info("Shutting down") # Stop accepting new connections. - for server in self.servers: - server.close() for sock in sockets or []: sock.close() + for server in self.servers: + server.close() for server in self.servers: await server.wait_closed() diff --git a/uvicorn/supervisors/multiprocess.py b/uvicorn/supervisors/multiprocess.py index 87ce91f154..4225b983cf 100644 --- a/uvicorn/supervisors/multiprocess.py +++ b/uvicorn/supervisors/multiprocess.py @@ -63,8 +63,13 @@ def startup(self) -> None: self.processes.append(process) def shutdown(self) -> None: + for socket in self.sockets: + socket.close() + for process in self.processes: process.terminate() + + for process in self.processes: process.join() message = "Stopping parent process [{}]".format(str(self.pid))