Most "active" coroutine library project?
sajmikins at gmail.com
Fri Sep 25 21:25:32 CEST 2009
On Fri, Sep 25, 2009 at 2:07 PM, Jason Tackaberry <tack at urandom.ca> wrote:
> On Fri, 2009-09-25 at 15:42 +0000, Grant Edwards wrote:
>> You can't call a function that yields control back to the other
>> coroutine(s). By jumping through some hoops you can get the
>> same effect, but it's not very intuitive and it sort of "feels
>> wrong" that the main routine has to know ahead of time when
>> calling a function whether that function might need to yield or
> Not directly, but you can simulate this, or at least some pseudo form of
> it which is useful in practice. I suppose you could call this "jumping
> through some hoops," but from the point of view of the coroutine, it can
> be done completely transparently, managed by the coroutine scheduler.
> In kaa, which I mentioned earlier, this might look like:
> import kaa
> def task(name):
> for i in range(10):
> print name, i
> yield kaa.NotFinished # kind of like a time slice
> def fetch_google():
> s = kaa.Socket()
> yield s.connect('google.com:80')
> print 'Connection failed'
> yield s.write('GET / HTTP/1.1\nHost: google.com\n\n')
> yield (yield s.read())
> def orchestrate():
> page = yield fetch_google()
> print 'Fetched %d bytes' % len(page)
> The two task() coroutines spawned by orchestrate() continue to "run in
> the background" while any of the yields in fetch_google() are pending
> (waiting on some network resource).
> It's true that the yields in fetch_google() aren't yielding control
> _directly_ to one of the task() coroutines, but it _is_ doing so
> indirectly, via the coroutine scheduler, which runs inside the main
So Kaa is essentially implementing the trampoline function.
If I understand it correctly MyHDL does something similar (to
implement models of hardware components running concurrently.)
More information about the Python-list