[Web-SIG] PEP 444 / WSGI 2 Async

Alice Bevan–McGregor alice at gothcandy.com
Fri Jan 7 09:39:28 CET 2011


On 2011-01-06 20:49:57 -0800, P.J. Eby said:
> It would be helpful if you addressed the issue of scope, i.e., 
> whatfeatures are you proposing to offer to the application developer.

Conformity, predictability, and portability.  That's a lot of y's.  
(Pardon the pun!)

Alex Grönholm's post describes the goal quite clearly.

> So far, I believe you're the second major proponent (i.e. ones with 
> concrete proposals and/or implementations to discuss) of an async 
> protocol... and what you have in common with the other proponent is 
> that you happen to have written an async server that would benefit from 
> having apps operating asynchronously.  ;-)

Well, the Marrow HTTPd does operate in multi-process mode, and, one 
day, multi-threaded or a combination.  Integration of a futures 
executor to the WSGI environment would alleviate the major need for a 
multi-threaded implementation in the server core; intensive tasks can 
be deferred to a thread pool vs. everything being deferred to a thread 
pool.  (E.g. template generation, PDF/other text extraction for 
indexing of file uploads, image scaling, etc. all of which are real use 
cases I have which would benefit from futures.)

> I find it hard to imagine an app developer wanting to do something 
> asynchronously for which they would not want to use one of the big-dog 
> asynchronous frameworks.  (Especially if their app involves database 
> access, or other communications protocols.)

Admittedly, a truly async server needs some way to allow file 
descriptors to be registered with the reactor core, with the WSGI 
application being resumed upon some event (e.g. socket is readable or 
writeable for DB access, or even pipe operations for use cases I can't 
think of at the moment).

Futures integration is a Good Idea, IMHO, and being optional and easily 
added to the environ by middleware for servers that don't implement it 
natively is even better.

As for how to provide a generic interface to an async core, I have two 
ideas, but one is magical and the other is more so; I'll describe these 
in a descrete post.

> This doesn't mean I think having a futures API is a bad thing, butISTM 
> that a futures extension to WSGI 1 could be defined right nowusing an 
> x-wsgi-org extension in that case...  and you could thenfind out how 
> many people are actually interested in using it.

I'll add writing up a WSGI middleware layer that configures and adds a 
future.executor to the environ to my already overweight to-do list.  It 
actually is something I have a use for right now on at least one 
commercial project.  :)

> Mainly, though, what I see is people using the futures thing to shuffle 
> off compute-intensive tasks...

That's what it's for.  ;)

> ...but if they do that, then they're basically trying to make the 
> server's life easier...  but under the existing spec, any truly async 
> server implementing WSGI is going to run the *app* in a "future" of 
> some sort already...

Running the application in a future is actually not a half-bad way for 
me to add threading to marrow.server... thanks!

> Which means that the net result is that putting in async is like saying 
> to the app developer: "hey, you know this thing that you just could do 
> in WSGI 1 and the server would take care of it foryou?  Well, now you 
> can manage that complexity by yourself!  Isn't that wonderful?"   ;-)

That's a bit extreme; PEP 444 servers may still implement threading, 
multi-processing, etc. at the reactor level (a la CherryPy or Paste).  
Giving WSGI applications access to a futures executor (possibly the one 
powering the main processing threads) simply gives applications the 
ability to utilize it, not the requirement to do so.

> I could be wrong of course, but I'd like to see what concrete usecases 
> people have for async.

Earlier in this post I illustrated a few that directly apply to a 
commercial application I am currently writing.  I'll elaborate:

:: Image scaling would benefit from multi-processing (spreading the 
load across cores). Also, only one sacle is immediately required before 
returning the post-upload page: the thumbnail.  The other scales can be 
executed without halting the WSGI application's return.

:: Asset content extraction and indexing would benefit from threading, 
and would also not require pausing the WSGI application.

:: Since most templating engines aren't streaming (see my unanswered 
thread in the general mailing list re: this), pausing the application 
pending a particularly difficult render is a boon to single-threaded 
async servers, though true streaming templating (with flush semantics) 
would be the holy grail.  ;)

:: Long-duration calls to non-async-aware libraries such as DB access.  
The WSGI application could queue up a number of long DB queries, pass 
the futures instances to the template, and the template could then 
.result() (block) across them or yield them to be suspended and resumed 
when the result is available.

:: True async is useful for WebSockets, which seem a far superior 
solution to JSON/AJAX polling in addition to allowing real web-based 
socket access, of course.

> We dropped the first discussion of async six years ago because someone 
> (I think it might've been James)pointed out that, well, it isn't 
> actually that useful.  And every subsequent call for use cases since 
> has been answered with, "well, the use case is that you want it to be 
> async."

See the above.  ;)

	- Alice.




More information about the Web-SIG mailing list