[Twisted-Python] how do i do that

Drew Smathers drew.smathers at gmail.com
Thu May 7 12:17:20 MDT 2009


On Tue, May 5, 2009 at 6:39 AM,  <sophismus at gmx.de> wrote:
> hey,
> i'm quite new in python and twisted and did things wrong from the start now i have to reconsider my prog.
> first i thought of an easier example with almost the same functionality.
> functionality: client connects, sends info, all infos from all clients are concurrently processed, a special client with the right info at the right time gets a special msg
> i got this:
> it is thought that a client writes an int as birthday back...
>
> from twisted.internet import protocol, reactor, defer, threads
> days = []
> allprotocols = []
> class BServerProtocol(protocol.Protocol):
>        birthday = 0
>        def connectionMade(self):
>                print "puh"
>                global allprotocols
>                allprotocols.append(self)
>                print "allprotocols",allprotocols
>        def congratulate(self):
>                self.transport.write("congratulations")
>                return 'done'
>        def dataReceived(self,data):
>                print data
>                if int (data)>0:
>                        self.birthday = int(data)
>                        print "self.bday:",self.birthday
>                        global days
>                        days.append(int(data))
>                        self.transport.write("pff")
> #                       self.factory.deferred.callback("uiuiui+1")
>                if data == "thanks":
>                        self.write("well done")
> class BServerFactory(protocol.ServerFactory):
>        protocol = BServerProtocol
>        def __init__(self):
>                self.deferred = defer.Deferred()
> def proveday():
>        day = 5 #of may, think of this date as new decided
>                #from a white rabbit every time it runs
>        ret = -1
>        found = False
>        i = 0
>        length = len(allprotocols)
>        while (i<length and found == False):
>                birthday = allprotocols[i].birthday
>                print "birthday:",birthday
>                if birthday == day:
>                        print 'bday==day'
>                        print "allprotocols[i]:",allprotocols[i]
>                        found =True
>                        ret = i
>                        allprotocols[i].congratulate()
>                i+=1
>        return ret
> def startprove():
>        r = proveday()
>
> bsf = BServerFactory()
> #bsf.deferred.addCallback(registerSuccess)
> reactor.listenTCP(55555,bsf)
> reactor.callInThread(startprove)
> #commands =[(startprove,[],{})]
> #commands.append(startcong)#,[],{})
> #threads.callMultipleInThread(commands)
> reactor.run()
> _______________________
> allprotocols[i].congratulate() should get in connection with the client again, but nothing happens, when another client connects a lot of congratulations are thrown, it seems transport buffers. i tried a lot of things, with no better result, maybe i can get some hints to get a solution...
> thx
> stefan
>
>

One problem with the above code is you're calling transport.write from a thread:

http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#WhydoesittakealongtimefordataIsendwithtransport.writetoarriveattheothersideoftheconnection

The above code could also be improved by not using a thread and
instead scheduling a call to check birthdays:

http://twistedmatrix.com/documents/current/api/twisted.internet.task.LoopingCall.html

It would also make sense to attach such functionality to the Factory
rather than relying global state - maintain a list of protocols on the
Factory instance.

-Drew




More information about the Twisted-Python mailing list