Просмотр исходного кода

cleanup and wait for child processes

Unrud 7 лет назад
Родитель
Сommit
4fb851c80e
1 измененных файлов с 22 добавлено и 12 удалено
  1. 22 12
      radicale/server.py

+ 22 - 12
radicale/server.py

@@ -42,7 +42,7 @@ try:
 except ImportError:
 except ImportError:
     systemd = None
     systemd = None
 
 
-if os.name == "posix":
+if hasattr(os, "fork"):
     ParallelizationMixIn = socketserver.ForkingMixIn
     ParallelizationMixIn = socketserver.ForkingMixIn
 else:
 else:
     ParallelizationMixIn = socketserver.ThreadingMixIn
     ParallelizationMixIn = socketserver.ThreadingMixIn
@@ -75,6 +75,9 @@ else:
 class ParallelHTTPServer(ParallelizationMixIn,
 class ParallelHTTPServer(ParallelizationMixIn,
                          wsgiref.simple_server.WSGIServer):
                          wsgiref.simple_server.WSGIServer):
 
 
+    # wait for child processes/threads
+    _block_on_close = True
+
     # These class attributes must be set before creating instance
     # These class attributes must be set before creating instance
     client_timeout = None
     client_timeout = None
     max_connections = None
     max_connections = None
@@ -311,14 +314,21 @@ def serve(configuration, shutdown_socket=None):
         # Fallback to busy waiting. (select.select blocks SIGINT on Windows.)
         # Fallback to busy waiting. (select.select blocks SIGINT on Windows.)
         select_timeout = 1.0
         select_timeout = 1.0
     logger.info("Radicale server ready")
     logger.info("Radicale server ready")
-    while True:
-        rlist, _, xlist = select.select(sockets, [], sockets, select_timeout)
-        if xlist:
-            raise RuntimeError("unhandled socket error")
-        if shutdown_socket in rlist:
-            logger.info("Stopping Radicale")
-            break
-        if rlist:
-            server = servers.get(rlist[0])
-            if server:
-                server.handle_request()
+
+    with contextlib.ExitStack() as stack:
+        for _, server in servers.items():
+            # close server
+            stack.push(server)
+        while True:
+            rlist, _, xlist = select.select(
+                sockets, [], sockets, select_timeout)
+            if xlist:
+                raise RuntimeError("unhandled socket error")
+            if shutdown_socket in rlist:
+                logger.info("Stopping Radicale")
+                break
+            if rlist:
+                server = servers.get(rlist[0])
+                if server:
+                    server.handle_request()
+                    server.service_actions()