[Web-SIG] Server-side async API implementation sketches

P.J. Eby pje at telecommunity.com
Sat Jan 8 22:16:52 CET 2011


As a semi-proof-of-concept, I whipped these up:

   http://peak.telecommunity.com/DevCenter/AsyncWSGISketch

It's an expanded version of my Coroutine concept, updated with sample 
server code for both a synchronous server and an asynchronous 
one.  The synchronous "server" is really just a decorator that wraps 
a WSGI2 async app with futures support, and handles pauses by simply 
waiting for the future to finish.

The asynchronous server is a bit more hand-wavy, in that there are 
some bits (clearly marked) that will be server/framework 
dependent.  However, they should be straightforward for a specialist 
in any given async framework to implement.

What is *most* handwavy at the moment, however, is in the details of 
precisely what one is allowed to "yield to".  I've written the 
sketches dealing only with PEP 3148 futures, but sockets were also 
proposed, and IMO there should be simple support for obtaining data 
from wsgi.input.

However, even this part is pretty easy to extrapolate: both server 
examples just add more type-testing branches in their 
"base_trampoline()" function, copying and modifying the existing 
branches that deal with futures.

The entire result is surprisingly compact -- each server weighed in 
at about 40 lines, and the common Coroutine class used by both adds 
another 60-something lines.

In the limit case, it appears that any WSGI 1 server could provide an 
(emulated) async WSGI2 implementation, simply by wrapping WSGI2 apps 
with a finished version of the decorator in my sketch.

Or, since users could do it themselves, this would mean that WSGI2 
deployment wouldn't be dependent on all server implementers 
immediately turning out their own WSGI2 implementations.

True async API implementations would be more involved, of course -- 
using a WSGI2 decorator on say, Twisted's WSGI1 implementation, would 
give you no performance advantages vs. using Twisted's APIs 
directly.  But, as soon as someone wrote a Twisted-specific 
translation of my async-server sketch, such an app would be portable.

More discussion is still needed, but at this point I'm convinced the 
concept is *technically* feasible.  (Whether there's enough need in 
the "market" to make it worthwhile, is a separate question.)



More information about the Web-SIG mailing list