[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