summaryrefslogtreecommitdiff
path: root/paste/httpserver.py
diff options
context:
space:
mode:
authorianb <devnull@localhost>2006-12-18 00:33:40 +0000
committerianb <devnull@localhost>2006-12-18 00:33:40 +0000
commit8fd237055f44f36241c1cd7bf240c7ffa189ee1e (patch)
treee958f122dc0d63ea694eebad2b5d29fa712ce40b /paste/httpserver.py
parent09a9e2d7a5c276164971cae9492e6a663b44abf8 (diff)
downloadpaste-8fd237055f44f36241c1cd7bf240c7ffa189ee1e.tar.gz
Apply #146, avoid orphaned threadpool, from jek
Diffstat (limited to 'paste/httpserver.py')
-rwxr-xr-xpaste/httpserver.py18
1 files changed, 12 insertions, 6 deletions
diff --git a/paste/httpserver.py b/paste/httpserver.py
index 7c44e7d..4a01dbb 100755
--- a/paste/httpserver.py
+++ b/paste/httpserver.py
@@ -360,7 +360,7 @@ class ThreadPool(object):
"""
SHUTDOWN = object()
- def __init__(self, nworkers, name="ThreadPool"):
+ def __init__(self, nworkers, name="ThreadPool", daemon=False):
"""
Create thread pool with `nworkers` worker threads.
"""
@@ -371,9 +371,13 @@ class ThreadPool(object):
for i in range(self.nworkers):
worker = threading.Thread(target=self.worker_thread_callback,
name=("%s worker %d" % (self.name, i)))
+ worker.setDaemon(daemon)
worker.start()
self.workers.append(worker)
+ if not daemon:
+ atexit.register(lambda: self.shutdown())
+
def worker_thread_callback(self):
"""
Worker thread should call this method to get and process queued
@@ -401,13 +405,13 @@ class ThreadPoolMixIn:
"""
Mix-in class to process requests from a thread pool
"""
- def __init__(self, nworkers):
+ def __init__(self, nworkers, daemon=False):
# Create and start the workers
self.running = True
assert nworkers > 0, "ThreadPoolMixin servers must have at least one worker"
self.thread_pool = ThreadPool(nworkers,
"ThreadPoolMixin HTTP server on %s:%d"
- % (self.server_name, self.server_port))
+ % (self.server_name, self.server_port), daemon)
def process_request(self, request, client_address):
"""
@@ -486,10 +490,11 @@ class WSGIServer(ThreadingMixIn, WSGIServerBase):
class WSGIThreadPoolServer(ThreadPoolMixIn, WSGIServerBase):
def __init__(self, wsgi_application, server_address,
- RequestHandlerClass=None, ssl_context=None, nworkers=10):
+ RequestHandlerClass=None, ssl_context=None,
+ nworkers=10, daemon_threads=False):
WSGIServerBase.__init__(self, wsgi_application, server_address,
RequestHandlerClass, ssl_context)
- ThreadPoolMixIn.__init__(self, nworkers)
+ ThreadPoolMixIn.__init__(self, nworkers, daemon_threads)
def serve(application, host=None, port=None, handler=None, ssl_pem=None,
ssl_context=None, server_version=None, protocol_version=None,
@@ -615,7 +620,8 @@ def serve(application, host=None, port=None, handler=None, ssl_pem=None,
if converters.asbool(use_threadpool):
server = WSGIThreadPoolServer(application, server_address, handler,
- ssl_context, int(threadpool_workers))
+ ssl_context, int(threadpool_workers),
+ daemon_threads)
else:
server = WSGIServer(application, server_address, handler, ssl_context)
if daemon_threads: