[Web-SIG] WSGI 2.0
Manlio Perillo
manlio_perillo at libero.it
Thu Oct 4 18:37:04 CEST 2007
Phillip J. Eby ha scritto:
> [...]
>> and existing
>> WSGI implementations does not interleave the iteration, as far as I know.
>
> Nothing in the spec stops them from doing so - indeed, they're
> *encouraged* to do so:
>
> http://www.python.org/dev/peps/pep-0333/#middleware-handling-of-block-boundaries
>
>
> """This requirement ensures that asynchronous applications and servers
> can conspire to reduce the number of threads that are required to run a
> given number of application instances simultaneously."""
>
> Notice that the only way this sentence works is if you are interleaving
> applications.
>
What "normal" HTTP servers do is to "pause" the iteration, until the
entire buffer has been sent to the client.
They can do this, since they run in a dedicated thread or process.
With nginx this is not true.
nginx mod_wsgi will pause the iteration associated with a given request,
but will start a new iteration as soon as a new request arrives, and
this in the *same* thread.
To make an example (not tested), suppose that a WSGI application keeps a
global counter (as a thread specific data).
When a new request arrives, the counter is reset to 0, and its value is
incremented for every iteration.
With all the existing WSGI implementation (as far as I know), we always
know the current value of the counter: it will start at 0, reach the
number of iterations, and then will start at 0 again.
With nginx mod_wsgi this is not true, when a WSGI application set the
counter value to, say, 6, and a new request arrives, the application
associated with the previous request will now see the value 0, not 6,
when it will be unpaused.
> That being said, the PEP really needs an explicit discussion of the
> execution model.
Regards Manlio Perillo
More information about the Web-SIG
mailing list