[Stackless] Deferreds and Tasklets

Carlos Eduardo de Paula carlosedp at gmail.com
Tue Apr 8 20:23:59 CEST 2008


Hi Simon,

Have you looked at the examples project? I made a small example using  
PB in a producer/consumer demo where the producers and consumers  
access a shared pool in a server using PB.

You can see it here:

http://code.google.com/p/stacklessexamples/wiki/StacklessTwisted

http://stacklessexamples.googlecode.com/svn/trunk/examples/twisted/twistedProdCon-Server.py
http://stacklessexamples.googlecode.com/svn/trunk/examples/twisted/twistedProdCon-Client.py

Regards,

Carlos


On 06/04/2008, at 13:42, Simon Pickles wrote:

> So I am still fiddling with interesting ways to combine stackless and
> twisted. Its fun, but I am probably naively hacking! (I always seem to
> want to use the deprecated code!- probably says a lot about me?)
>
> I'm using Perspective Broker to do remote calls to an app running
> Twisted-Stackless. PB is positively brilliant, btw.
>
> So say the a remote caller wants to get data from my app. It calls
> remote_GetData() in my PB app, which uses the actor model(each object
> has a channel.receive() running in its own tasklet).
>
> remote_GetData() has to send a message thru a stackless.channel() to  
> get
> the required data, then it must stackless.schedule()
>
> Now it waits for the result to arrive at its own channel.receive(),
> which then needs to be passed back as the return value of  
> remote_GetData().
>
> Is this possible?
>
> Perhaps like this:
>
> from twisted.spread import pb
> from twisted.internet import reactor
> import stackless
>
> dbRx = stackless.channel()
> pbRx = stackless.channel()
>
> class DataSource:
>   def Listen(self):
>       while 1:
>           msg = dbrx.receive() # a channel will arrive here
>           msg.send(42)
>           stackless.schedule()
>   def __init__(self):
>       stackless.tasklet(self.Listen)()
>
>
> class pbBroker(pb.Referenceable):
>   def remote_GetData(self):
>       dbRx.send(pbRx)
>       result = pbRx.receive()
>       # return 42 to remote caller thru pb
>       return result
>
> This isn't ideal since I don't want pbBroker to block during the
> receive. I'd like it to closer resemble the Listen loop of the first
> class, so other objects can talk to pbBroker while it is waiting.  
> Maybe
> like this:
>
> class pbBroker(pb.Referenceable):
>   def Listen(self):
>       while 1:
>           msg = self.rx.receive()
>           # do stuff with msg from other local objects
>           stackless.schedule()
>   def __init__(self):
>       self.rx = stackless.channel()
>       stackless.tasklet(self.Listen)()
>   def remote_GetData(self):
>       ch = stackless.channel()
>       dbRx.send(ch)
>       # can block since its a dedicated channel
>       result = ch.receive()
>       # return 42 to remote caller thru pb
>       return result
> I guess the same problem arise when remote_GetData() has to use a
> deferred too.
>
> from twisted.enterprise import adbapi
> dbPool = adbapi.ConnectionPool("MySQLdb", db="db", user="user",
> passwd="pw")
>
> class pbBroker(pb.Referenceable):
>   def remote_GetDeferredData(self):
>       d = dbPool.runInteraction(DoQuery, "SELECT * FROM users") #
> DoQuery just wraps a query with try/except
>       d.addCallback(self.GetDeferredData_Success)
>
>   def GetDeferredData_Success(self, result):
>       # return to remote caller thru pb
>       return result   ## WRONG
>
> How can I return a value for a remote_* call when I only get that  
> value
> thru another callback?
>
> Sorry its a long and confusing one!
>
> Simon
>
>
> -- 
> Linux user #458601 - http://counter.li.org.
>
>
>
>
>
> -- 
> Linux user #458601 - http://counter.li.org.
>
>
>
>
> _______________________________________________
> Stackless mailing list
> Stackless at stackless.com
> http://www.stackless.com/mailman/listinfo/stackless





More information about the Stackless mailing list