freeze function calls
Peter Otten
__peter__ at web.de
Tue Aug 10 08:48:39 EDT 2010
Santiago Caracol wrote:
>> Python offers an elegant mechanism to calculate values on demand: the
>> generator function:
>>
>> >>> def calculate_answers():
>>
>> ... for i in range(100):
>> ... print "calculating answer #%d" % i
>> ... yield i * i
>> ...
>>
>
> Thanks for pointing this out. I was aware of the yield statement.
>
> My problem is this:
>
> (1) The user submits a query:
>
> ---------------------------------
> | What is the answer? |
> ---------------------------------
> <Submit>
>
> (2) The web server gives the user N answers and a button saying "More
> answers":
>
> . answer 1
> . answer 2
> . answer 3
>
> <More answers>
>
> At this stage the function that writes html to the user has been
> called. The call must be terminated, or else, the user doesn't get any
> html. This means that the call of the answer-calculating function,
> whether it uses yield or not, is also terminated. This means, when the
> user presses the <More answers>-button, the calculation has to start
> at the beginning.
Adapted from the wsgiref documentation at
http://docs.python.org/library/wsgiref.html
$ cat wsgi_demo.py
from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server
from itertools import count, islice
def answers():
for i in count():
yield "Answer #%d\n" % i
gen = answers()
def simple_app(environ, start_response):
setup_testing_defaults(environ)
status = '200 OK'
headers = [('Content-type', 'text/plain')]
start_response(status, headers)
return islice(gen, 3)
httpd = make_server('', 8000, simple_app)
print "Serving on port 8000..."
httpd.serve_forever()
Run the above with
$ python wsgi_demo.py
Serving on port 8000...
Now point your favourite browser to http://localhost:8000/ and hit refresh.
Peter
More information about the Python-list
mailing list