Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Re: Co-routines

Reply
Thread Tools

Re: Co-routines

 
 
Clark C. Evans
Guest
Posts: n/a
 
      07-17-2003
On Thu, Jul 17, 2003 at 11:07:36PM +1000, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
| I have an application in which I want the users to be able to create python
| functions:
|
| def f1():
| print "1-1"
| print "1-2"
| print "1-3"
|
| def f2():
| print "2-1"
| print "2-2"
| print "3-3"
|
| and when my application runs, I want to execute these functions in
| "lock-step", so that the output looks like:
|
| 1-1
| 2-2
| 1-2
| 2-2
| 1-3
| 2-3

There is a 'Flow' module in Twisted which uses generators to
accomplish this sort of thing. Basically, Twisted has a
queue of functions that are called, and by yielding "cooperate"
object, you re-schedule the given generator for execution
on this queue (allowing other code blocks to execute).

from __future__ import generators
from twisted.flow import flow
from twisted.internet import reactor

coop = flow.Cooperate()
def f1():
print "1-1"
yield coop
print "1-2"
yield coop
print "1-3"

def f2():
print "2-1"
yield coop
print "2-2"
yield coop
print "2-3"

d = flow.Deferred(flow.Merge(f1(),f2()))
d.addCallback(lambda _: reactor.stop())
reactor.run()

I'm working on converting many 'data sources' such as PostreSQL
and OpenLDAP so that their async interface works this way.
See http://www.twistedmatrix.com/documents/howto/flow.html
for more information on the flow module.

Best,

Clark

P.S. If you wished, you could probably use flow without Twisted.
You'd have to do three things: (a) create an event queue object, such
as twisted.internet.reactor, (b) provide a notification when something
scheduled is done, aka twisted.internet.defer, and (c) provide some
way to handle exceptions in an async manner, aka twisted.python.fail.
Although, once you have all of these things in place... why not just
use the rest of Twisted... *grin* In other words, it is easy in
theory to implement this correctly, but not that easy if you want
to have it work with sockets and properly handle exceptions...
So, by the time you do all of this, you will have re-invented the
core of Twisted... and then you won't have a built-in http server
nor a community to support you.

 
Reply With Quote
 
 
 
 
Brian Kelley
Guest
Posts: n/a
 
      07-17-2003

> There is a 'Flow' module in Twisted which uses generators to
> accomplish this sort of thing. Basically, Twisted has a
> queue of functions that are called, and by yielding "cooperate"
> object, you re-schedule the given generator for execution
> on this queue (allowing other code blocks to execute).
>


Check out this article:

http://www-106.ibm.com/developerwork...one=opensource

on weightless threads, a simpler version of "Flow"

Now, my question is, could an arbitrary function's bytecode be liberally
sprinkled with "yeilds" at run-time to achieve this effect without
having to alter the source code?

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments