freeze function calls

Peter Otten __peter__ at web.de
Tue Aug 10 14:10:36 CEST 2010


Santiago Caracol wrote:

> Hello,
> 
> I want to write a web application that does 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>
> 
> I am aware of several ways to do this: I could calculate all
> answers, but show only the first N of them. For certain kinds of
> calulations,
> I could use a kind of setoff argument. But I would like to do it in a
> more general
> and (hopefully) efficient way:
> 
> I want the function or object that calculates the answers to be
> "frozen" at the point at which it has already calculated N answers. If
> the function gets a <More answers>-signal within a reasonable period
> of time, it goes on producing more answers exactly at the point at
> which it got frozen. If no signal is sent, the function call is
> terminated automatically after
> M seconds.
> 
> Note that, although the program to be written is a web application,
> this is not a question about web application specific things. My only
> difficulty is how to "freeze" function calls.
> 
> Has anyone done something of this kind?

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
...
>>> from itertools import islice
>>> gen = calculate_answers()

This builds the generator but doesn't run the code inside. Now let's look at 
the first three "answers":

>>> for answer in islice(gen, 3):
...     print "the answer is", answer
...
calculating answer #0
the answer is 0
calculating answer #1
the answer is 1
calculating answer #2
the answer is 4

If you repeat the last step you get the next three answers:

>>> for answer in islice(gen, 3):
...     print "the answer is", answer
...
calculating answer #3
the answer is 9
calculating answer #4
the answer is 16
calculating answer #5
the answer is 25

Peter



More information about the Python-list mailing list