On 12/01/2010 03:41 AM, Robert Ladyman wrote:
I was thinking of writing an eventlet server for Quixote so it can
handle requests that block or require heavy computation more
efficiently. Has anyone already tried to this or foresee any issues?
I realize that there is Twisted server for Quixote as well (which I am
currently using in one of my projects) but Twisted's "deferred
generator" doesn't play well with Quixote.
Thanks,
Salman
I would watch out for session management - some of the storage methods are not
thread-safe.
After wrestling with that thought for a while, I've come to the
conclusion that it may be a non-issue since eventlet uses co-routines
rather than actual threads (although it is certainly possible to use
real threads too).
That said, here are the two things that I needed to implement to run my
site using eventlet's event loop.
eventlet_server.py
---
import eventlet
from eventlet import wsgi
from quixote2.wsgi import QWIP
def run(create_publisher, host='', port=80):
""" Wrap the publisher inside a QWIP instance and serve via
eventlet.wsgi
"""
publisher = create_publisher()
app = QWIP(publisher)
logfd = open('/dev/null', 'w')
wsgi.server(eventlet.listen((host, port)), app, logfd)
if __name__ == '__main__':
from quixote2.server.util import main
main(run)
---
eventlet_publisher.py
---
from quixote.publish import Publisher
import eventlet
class EventletPublisher (Publisher):
""" Extends the quixote Publisher class so it can handle multiple http
request objects simultaneously.
Inspired from Quixote-2.6/doc/multi-threaded.txt
"""
is_thread_safe = True
def __init__ (self, root_directory, logger=None, session_manager=None,
config=None, **kwargs):
Publisher.__init__(self, root_directory, logger, session_manager,
config, **kwargs)
self._request_dict = {}
def _set_request(self, request):
self._request_dict[eventlet.greenlet.getcurrent()] = request
def _clear_request(self):
try:
del self._request_dict[eventlet.greenlet.getcurrent()]
except KeyError:
pass
def get_request(self):
return self._request_dict.get(eventlet.greenlet.getcurrent())
---
Thanks,
Salman
_______________________________________________
Quixote-users mailing list
[email protected]
http://mail.mems-exchange.org/mailman/listinfo/quixote-users