From 858f1c58edc5a623efb17569fa21d0d974b87fbc Mon Sep 17 00:00:00 2001 From: euri10 Date: Fri, 20 Dec 2019 17:50:33 +0100 Subject: [PATCH] Sharing socket across workers on windows --- uvicorn/main.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/uvicorn/main.py b/uvicorn/main.py index d16727344..b6292a62f 100644 --- a/uvicorn/main.py +++ b/uvicorn/main.py @@ -414,8 +414,19 @@ async def startup(self, sockets=None): if sockets is not None: # Explicitly passed a list of open sockets. # We use this when the server is run from a Gunicorn worker. + + def _share_socket(sock: socket) -> socket: + # Windows requires the socket be explicitly shared across + # multiple workers (processes). + from socket import fromshare # type: ignore + + sock_data = sock.share(os.getpid()) # type: ignore + return fromshare(sock_data) + self.servers = [] for sock in sockets: + if config.workers > 1 and platform.system() == "Windows": + sock = _share_socket(sock) server = await loop.create_server( create_protocol, sock=sock, ssl=config.ssl )