06.01.2011 23:11, Sylvain Hellegouarch kirjoitti:


2011/1/6 Alex Grönholm <alex.gronh...@nextday.fi <mailto:alex.gronh...@nextday.fi>>

    06.01.2011 20:02, Eric Larson kirjoitti:

        At Thu, 6 Jan 2011 13:03:15 +0000 (GMT),
        chris dent wrote:

            <snip>
            On async:

            I agree with some others who have suggested that maybe
            async should be
            its own thing, rather than integrated into a WSGI2. A
            server could
            choose to be WSGI2 compliant or AWSGI compliant, or both.
            </snip>

        +1

        After seeing some of the ideas regarding how to add async into
        a new
        version of WSGI, it isn't the specific problem the async feature
        addresses in terms of WSGI servers. Is the goal is to support long
        running connections? Are we trying to support WebSockets and other
        long running connection interfaces? If that is the case, async
        is a
        *technique* for handling this paradigm, but it doesn't address the
        real problem. There are techniques that have sounded
        reasonable like
        making available the socket such that a server can give it to the
        application to do something use with it (here is an example doing
        something similar with CherryPy -
        http://trac.defuze.org/browser/oss/ws4cp/ws4cp.py).

    The primary idea behind asynchronous servers/applications is the
    ability to efficiently serve a huge number of concurrent
    connections with a small number of threads. Asynchronous
    applications tend to be faster because there is less thread
    context switching happening in the CPU. Any application that runs
    on top of a web server that allocates less threads to the
    application than the number of connections has to be quick to
    respond so as not to starve the thread pool or block the event
    loop. This is true regardless of whether nonblocking I/O or some
    other technique is used. I'm a bit unclear as to how else you
    would do this. Care to elaborate on that? I looked at the Cherrypy
    code, but I couldn't yet figure that out.


Since I wrote that piece of code, I guess I ought to chime in. First of all, the code isn't part of CherryPy, simply it's one idea to provide WebSocket to CherryPy. Considering WebSocket bootstraps on HTTP but once that's done, it's just a raw socket with bits and pieces on top, I wanted to find a way not to block CherryPy from serving other requests once a WebSocket handshake had been performed. The idea was simply to detach the socket from the worker thread once the handshake had been performed. Then the application had a socket at hand and this particular instance, I simply decided to use asyncore to loop through those sockets aside from the CherryPy HTTP server. In effect, you end up with asyncore for WS sockets and CherryPy for any HTTP serving but from within one single process, using CherryPy's main loop.

By large this is not a generic solution for implementing async in WSGI but a specific example on how one can have both threads and an async loop playing together. It's merely a proof of concept :)
Yes, this is how I figured it too. In the end, what really matters is that code that doesn't get a dedicated thread has to be designed a little differently. The purpose of this discussion is to come up with a standard interface for such applications. I'd also like to explore the possibility of incorporating such a mechanism in PEP 444, provided that it does not complicate the implementation too much. Otherwise, a separate specification may be necessary.

Hope that clarifies that piece of code.
--
- Sylvain
http://www.defuze.org
http://twitter.com/lawouach

_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to