Dirk Mueller
f07495d804
- Add 0001_create_a_thread_to_reap_death_process.patch Fixes bsc#954591 - update to 0.11.3: - Added reloader_paths option to run_simple and other functions in werkzeug.serving. This allows the user to completely override the Python module watching of Werkzeug with custom paths. - Many custom cached properties of Werkzeug’s classes are now subclasses of Python’s property type (issue #616). - bind_to_environ now doesn’t differentiate between implicit and explicit default port numbers in HTTP_HOST (pull request #204). - BuildErrors are now more informative. They come with a complete sentence as error message, and also provide suggestions (pull request #691). - Fix a bug in the user agent parser where Safari’s build number instead of version would be extracted (pull request #703). - Fixed issue where RedisCache set_many was broken for twemproxy, which doesn’t support the default MULTI command (pull request #702). - mimetype parameters on request and response classes are now always converted to lowercase. - Changed cache so that cache never expires if timeout is 0. This also fixes an issue with redis setex (issue #550) - Werkzeug now assumes UTF-8 as filesystem encoding on Unix if Python detected it as ASCII. - New optional has method on caches. - Fixed various bugs in parse_options_header (pull request #643). - If the reloader is enabled the server will now open the socket in the parent process if this is possible. This means that when the reloader kicks in the connection from client will wait instead of OBS-URL: https://build.opensuse.org/request/show/358349 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-Werkzeug?expand=0&rev=16
65 lines
2.3 KiB
Diff
65 lines
2.3 KiB
Diff
From 676bc5fa4b6aa9d153c9805cdbad0ff0450bade6 Mon Sep 17 00:00:00 2001
|
|
From: Alberto Planas <aplanas@gmail.com>
|
|
Date: Wed, 3 Feb 2016 11:56:23 +0100
|
|
Subject: [PATCH] Create a thread to reap death process
|
|
|
|
ForkingWSGIServer use `SocketServer.ForkingMixIn` to implement a
|
|
multiprocess server. This class provides a workflow that collect
|
|
death process (process in Zombie status) before the
|
|
`process_request`. This means that this process itself will be
|
|
in Zombie status at the end of the request, that will be eventually
|
|
collected during the next `process_request`.
|
|
|
|
To minimize transient Zombie process, `ForkingWSGIServer` is
|
|
creating a daemon thread (via `threading.Timer`) to call the
|
|
collector every (by default) 5 seconds.
|
|
|
|
Fixes #810
|
|
---
|
|
werkzeug/serving.py | 21 ++++++++++++++++++++-
|
|
1 file changed, 20 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/werkzeug/serving.py b/werkzeug/serving.py
|
|
index 15b6cd7..778df2d 100644
|
|
--- a/werkzeug/serving.py
|
|
+++ b/werkzeug/serving.py
|
|
@@ -41,6 +41,7 @@
|
|
import socket
|
|
import sys
|
|
import signal
|
|
+import threading
|
|
|
|
from ._compat import PY2
|
|
|
|
@@ -522,11 +523,29 @@ class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer):
|
|
multiprocess = True
|
|
|
|
def __init__(self, host, port, app, processes=40, handler=None,
|
|
- passthrough_errors=False, ssl_context=None, fd=None):
|
|
+ passthrough_errors=False, ssl_context=None, fd=None,
|
|
+ frequency=5):
|
|
BaseWSGIServer.__init__(self, host, port, app, handler,
|
|
passthrough_errors, ssl_context, fd)
|
|
self.max_children = processes
|
|
|
|
+ if frequency:
|
|
+ self.frequency = frequency
|
|
+ self.setup_reap_children()
|
|
+
|
|
+ def setup_reap_children(self):
|
|
+ """Create a thread to collect death children."""
|
|
+ t = threading.Timer(self.frequency, self.reap_children)
|
|
+ # Set daemon mode to provide a clean termination of the thread
|
|
+ # when the system ends
|
|
+ t.daemon = True
|
|
+ t.start()
|
|
+
|
|
+ def reap_children(self):
|
|
+ """Reap or collect death children."""
|
|
+ self.collect_children()
|
|
+ self.setup_reap_children()
|
|
+
|
|
|
|
def make_server(host=None, port=None, app=None, threaded=False, processes=1,
|
|
request_handler=None, passthrough_errors=False,
|