[Stackless] Deferreds and Tasklets

Simon Pickles sipickles at hotmail.com
Wed Apr 9 17:13:34 CEST 2008



Carlos Eduardo de Paula wrote:
> 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

Oh yeah! This is really great. I'd seen this a while back, but forget it 
was combining stackless/twisted so nicely!

Thanks!
>
> 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
>
>
>

-- 
Linux Counter: User# 424693 







More information about the Stackless mailing list