Search code examples
pythongeneratormultiprocessingeager

How can I run the initialization code for a generator function immediately, rather than at the first call?


I have a generator function that goes something like this:

def mygenerator():
    next_value = compute_first_value() # Costly operation
    while next_value != terminating_value:
        yield next_value
        next_value = compute_next_value()

I would like the initialization step (before the while loop) to run as soon as the function is called, rather than only when the generator is first used. What is a good way to do this?

I want to do this because the generator will be running in a separate thread (or process, or whatever multiprocessing uses) and I won't be using the return for a short while, and the initialization is somewhat costly, so I would like it to do the initialization while I'm getting ready to use the values.


Solution

  • class mygenerator(object):
        def __init__(self):
            self.next_value = self.compute_first_value()
        def __iter__(self):
            return self
        def next(self):
            if self.next_value == self.terminating_value:
                raise StopIteration()
            return self.next_value