From 7be82159f4664365dd25679341598d94f3592c44 Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 3 Jun 2017 18:41:21 +0200 Subject: [PATCH] Add LockableThreadPool class. --- evennia/server/server.py | 6 +++--- evennia/server/webserver.py | 23 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/evennia/server/server.py b/evennia/server/server.py index b5a1aff514..c510d25664 100644 --- a/evennia/server/server.py +++ b/evennia/server/server.py @@ -526,12 +526,12 @@ if WEBSERVER_ENABLED: # Start a django-compatible webserver. - from twisted.python import threadpool - from evennia.server.webserver import DjangoWebRoot, WSGIWebServer, Website + #from twisted.python import threadpool + from evennia.server.webserver import DjangoWebRoot, WSGIWebServer, Website, LockableThreadPool # start a thread pool and define the root url (/) as a wsgi resource # recognized by Django - threads = threadpool.ThreadPool(minthreads=max(1, settings.WEBSERVER_THREADPOOL_LIMITS[0]), + threads = LockableThreadPool(minthreads=max(1, settings.WEBSERVER_THREADPOOL_LIMITS[0]), maxthreads=max(1, settings.WEBSERVER_THREADPOOL_LIMITS[1])) web_root = DjangoWebRoot(threads) # point our media resources to url /media diff --git a/evennia/server/webserver.py b/evennia/server/webserver.py index e974226f7f..ccece63909 100644 --- a/evennia/server/webserver.py +++ b/evennia/server/webserver.py @@ -18,6 +18,8 @@ from twisted.internet import reactor from twisted.application import internet from twisted.web.proxy import ReverseProxyResource from twisted.web.server import NOT_DONE_YET +from twisted.python import threadpool +from twisted.internet.defer import Deferred from twisted.web.wsgi import WSGIResource from django.conf import settings @@ -28,6 +30,25 @@ from evennia.utils import logger _UPSTREAM_IPS = settings.UPSTREAM_IPS _DEBUG = settings.DEBUG + +class LockableThreadPool(threadpool.ThreadPool): + """ + Threadpool that can be locked from accepting new requests. + """ + def __init__(self, *args, **kwargs): + self._accept_new = True + + def lock(self): + self._accept_new = False + + def callInThread(self, func, *args, **kwargs): + """ + called in the main reactor thread. + """ + if self._accept_new: + threadpool.ThreadPool(self, func, *args, **kwargs) + + # # X-Forwarded-For Handler # @@ -115,7 +136,7 @@ class DjangoWebRoot(resource.Resource): """ This creates a web root (/) that Django understands by tweaking the way - child instancee ars recognized. + child instances are recognized. """ def __init__(self, pool): """