python-Werkzeug/0001_create_a_thread_to_reap_death_process.patch
Dirk Mueller f07495d804 Accepting request 358349 from home:aplanas:branches:devel:languages:python
- 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
2016-02-09 09:45:07 +00:00

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,