[Twisted-Python] help w/simple echo example w/deferred and threads

exarkun at divmod.com exarkun at divmod.com
Fri Apr 2 14:49:53 MST 2004


On Fri, 02 Apr 2004 16:11:16 -0500, "john nielsen" <jn at who.net> wrote:
>I am trying to make a very simple echo server use threads to understand how twisted handles blocking code.  I think I have the server ok but I am not sure how to have the client grab the data from a thread that finished some time later. If I comment out the sleep call, everything works fine. I looked at deferred but am a little confused. What is the simple code the client missing?
> 
> Thanks for any help,
> 
> john
> 
> Here is the server
> ###############
> from twisted.spread import pb
> from twisted.internet import reactor
> from twisted.python import threadable
> threadable.init()
> import time,random
> 
> class t:
>     def __init__(self):
>         self.result=''
>     def test(self,st='same'):
>         time.sleep(1)
>         print 'done sleeping'
>         self.result=st+':'+str(time.time())
>     
> class Echoer(pb.Root):
>     def __init__(self):
>         self.a=t()
>     def remote_echo(self, st):
>             reactor.callInThread(self.a.test,st)
>             print 'from thread',self.a.result
>             return self.a.result

  Instead of the above:

    class t:
        def test(self, st='same'):
            time.sleep(1)
            return st + ':' + str(time.time())

    from twisted.internet import threads

    class Echoer(pb.Root):
        def __init__(self):
            self.a = t()

        def remote_echo(self, st):
            return threads.deferToThread(self.a.test, st)

  This is a good example if "time.sleep(1)" is only a hand-wave put in place of real, computational-expensive code, which I assume it is.  If you simply want to delay the
result for one section, threads are not necessary:

        from twisted.internet import defer

        def remote_echo(self, st):
            d = defer.Deferred()
            reactor.callLater(1, d.callback, st + ':' + str(time.time() + 1))
            return d

  Be sure to read the Deferred howto in the documentation section of the website.

  Jp




More information about the Twisted-Python mailing list