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