Opposite of yield?

Oren Tirosh oren-py-l at hishome.net
Thu Sep 11 03:17:09 EDT 2003


On Wed, Sep 10, 2003 at 12:40:37PM -0700, achrist at easystreet.com wrote:
> The yield statement looks to be a big step toward some kind of
> lightweight concurrency-oriented programming in python.  Is there
> any similarly nice way to do the opposite of yield, just sit around
> (perhaps in the middle of a loop) and wait until some other routine
> (unknown to the waiting module) hurls a value in?

Here is a way of converting a generator function into a consumer using
a single item list as a mailbox:

from __future__ import generators

def consumer():
    print "This code runs before any data is fed to the consumer"
    mailbox = []; yield mailbox
    while mailbox:
        print "Here's what I got:", mailbox.pop()
        yield mailbox
    print "This code runs after end of data is signalled"

# How to feed a consumer:

i = 0
for mailbox in consumer():
    if i < 5:
        mailbox.append(i)      # feed next item
    i += 1


Output:
This code runs before any data is fed to the consumer
Here's what I got: 0
Here's what I got: 1
Here's what I got: 2
Here's what I got: 3
Here's what I got: 4
This code runs after end of data is signalled


For a more comprehensive solution try Christian Tismer's Stackless Python.

    Oren





More information about the Python-list mailing list