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

Reply via email to