Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Re: Co-routines (http://www.velocityreviews.com/forums/t319825-re-co-routines.html)

Clark C. Evans 07-17-2003 03:54 PM

Re: Co-routines
 
On Thu, Jul 17, 2003 at 11:07:36PM +1000, thewrights@ozemail.com.au 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.


Brian Kelley 07-17-2003 04:18 PM

Re: Co-routines
 

> 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?



All times are GMT. The time now is 09:20 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.