Here is a basic example of a coroutine :
def coroutine(func): def start(*args,**kwargs): cr = func(*args,**kwargs) cr.next() return cr return start @coroutine def grep(pattern): print "Looking for %s" % pattern while True: line = (yield) if pattern in line: print(line) g = grep("python")
We can create a class that contains such a coroutine and delegates its call to the send method in the coroutine:
class Foo(object): def __init__(self,pattern): self.count=1 self.pattern=pattern self.grep=self._grep() @coroutine def _grep(self): while True: line = (yield) if self.pattern in line: print(self.count, line) self.count+=1 def send(self,arg): self.grep.send(arg) foo = Foo("python") foo.send("Yeah, but no, but yeah, but no") foo.send("A series of tubes") foo.send("python generators rock!") foo.pattern='spam' foo.send("Some cheese?") foo.send("More spam?")
Note that foo acts like a coroutine (since it has a submit method), but it is a class - it can have attributes and methods that can interact with the coroutine.
For more information (and great examples), see David Beazley Curious Course on Corouts and Concurrency.
unutbu
source share