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