n00b question: Better Syntax for Coroutines?

Arnaud Delobelle arnodel at googlemail.com
Sat Sep 13 04:18:05 EDT 2008


On Sep 13, 2:08 am, i... at illusorygoals.com wrote:
> First off, I'm a python n00b, so feel free to comment on anything if
> I'm doing it "the wrong way." I'm building a discrete event simulation
> tool. I wanted to use coroutines. However, I want to know if there's
> any way to hide a yield statement.
>
> I have a class that I'd like to look like this:
>
> class Pinger(Actor):
>     def go(self):
>         success = True
>         while success:
>             result = self.ping("128.111.41.38")
>             if result != "success":
>                 success = False
>         print "Pinger done"
>
> But because I can't hide yield inside ping, and because I can't find a
> convenient way to get a self reference to the coroutine (which is used
> by the event queue to pass back results), my code looks like this:
>
> class Pinger(Actor):
>     def go(self):
>         # I dislike this next line
>         self.this_pointer = (yield None)
>         success = True
>         while success:
>             # I want to get rid of the yield in the next line
>             result = (yield self.ping("128.111.41.38"))
>             if result != "success":
>                 success = False
>         print "Pinger done"
>
> I posted a more detailed version of this as a rant here:http://illusorygoals.com/post/49926627/
>
> I'd like to know, is there a way to get the syntax I want? After
> staying up late last night to get a proof-of-concept working with
> coroutines, my boss expressed disappointment in the ugliness of the
> Pinger code (we agreed on the desired syntax above). I spent almost 2
> hours today to migrate the system over to threads. That made my boss
> happy, but I'm still curious if I can do something to salvage the
> coroutine version.
>
> Regards,
> IG

You can't avoid the yield, and generators are not coroutines.  A
little while ago when thinking about this kind of problem I defined
"cogenerators", which roughly are to generators what coroutines are to
routines, i.e. they can pass "yielding control" on to another
cogenerator [1].

[1] http://www.marooned.org.uk/~arno/python/cogenerator.html

--
Arnaud




More information about the Python-list mailing list