[Web-SIG] PEP 444 feature request - Futures executor
P.J. Eby
pje at telecommunity.com
Fri Jan 7 21:14:20 CET 2011
At 11:47 AM 1/7/2011 -0600, Timothy Farrell wrote:
>There has been much discussion about how to handle async in PEP 444
>and that discussion centers around the use of futures. However, I'm
>requesting that servers _optionally_ provide
>environ['wsgi.executor'] as a futures executor that applications can
>use for the purpose of doing something after the response is fully
>sent to the client. This is feature request is designed to be
>concurrency methodology agnostic.
>
>Some example use cases are:
>
>- send an email that might block on a slow email server (Alice, I
>read what you said about Turbomail, but one product is not the
>solution to all situations)
>- initiate a database vacuum
>- clean a cache
>- build a cache
>- compile statistics
>
>When serving pages of an application, these are all things that
>could be done after the response has been sent. Ideally these
>things don't need to be done in a request thread and aren't
>incredibly time-sensitive. It seems to me that futures would be an
>ideal way of handling this.
>
>Thoughts?
This seems like a potentially good way to do it; I suggest making it
a wsgi.org extension; see (and update)
http://www.wsgi.org/wsgi/Specifications with your proposal.
I would suggest including a simple sample executor wrapper that
servers could use to block all but the methods allowed by your
proposal. (i.e., presumably not shutdown(), for example.)
There are some other issues that might need to be addressed, like
maybe adding an attribute or two for the level of reliability
guaranteed by the executor, or allowing the app to request a given
reliability level. Specifically, it might be important to distinguish between:
* this will be run exactly once as long as the server doesn't crash
* this will eventually be run once, even if the server suffers a
fatal error between now and then
IOW, to indicate whether the thing being done is "transactional", so to speak.
I mean, I can imagine building a transactional service on top of the
basic service, by queuing task information externally, then just
using executor calls to pump the queue. But IMO it seems pretty
intrinsic to want that kind of persistence guarantee for at least the
email case, or, say, sending off a charge to a credit card or
something like that.
One other relevant use case: sometimes you want a long-running
process step that the user checks back in on periodically, so having
a way to get a "handle" for a future that can be kept in a session or
something might be important. Like, say, you're preparing a report
that will be viewed in the browser, and using meta-refresh or some
such to poll. The app needs to check on a previously queued future
and get its results.
I don't know how easy any of the above are to implement with the
futures API or your proposal, but they seem like worthwhile things to
have available, and actually would provide for some rich application
use cases. But if they're implementable over the futures API at all,
it should be possible to implement them as WSGI 1.x middleware or as
a server extension.
A spec like that definitely needs some thrashing out, but I don't
think it need derail any PEPs in progress: the API of such an
extension doesn't affect the basic WSGI protocol at all.
More information about the Web-SIG
mailing list