On 2011-01-09 07:04:49 -0800, exar...@twistedmatrix.com said:
I think this effort would benefit from more thought on how exactly accessing this external library support will work. If async wsgi is limited to performing a single read asynchronously, then it hardly seems compelling.

Apologies if the last e-mail was too harsh; I'm about to go to bed, and it' been a long night/morning. ;)

Here's a proposed solution: a generator API on top of futures.

If the async server implementing the executor can detect a generator being submitted, then:

:: The executor accepts the generator and begins iteration (passing the executor and the arguments supplied to submit).

:: The generator is expected to be /fast/.

:: The generator does work until it needs an operation over a file descriptor, at which point it yields the fd and the operation (say, 'r', or 'w').

:: The executor schedules with the async reactor the generator to be re-called when the operation is possible.

:: The Future is considered complete when the generator raises GeneratorExit and the first argument is used as the return value of the Future.

Yielding a 2-tuple of readers/writers would work, too, and allow for more concurrent utilization of sockets, though I'm not sure of the use cases for this. If so, the generator would be woken up when any of the readers or writers are available and sent() a 2-tuple of available_readers, available_writers.

The executor is passed along for any operations the generator can not accomplish safely without threads, and the executor, as it's running through the generator, will accomplish the same semantics as iterating the WSGI application: if a future instance is yielded, the generator is suspended until the future is complete, allowing heavy processing to be mixed with async calls in a fully async server.

The wsgi.input operations can be implemented this way, as can database operations and pretty much anything that uses sockets, pipes, or on-disk files. In fact, the WSGI application -itself- could be called in this way (with the omission of the executor or a simple wrapper that saves the executor into the environ).

Just a quick thought before running off to bed.

        - Alice.


_______________________________________________
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