[Twisted-Python] anyway to get data from a protocol instance?

Torsten Irländer feldmatrix at gmx.de
Wed Aug 9 13:20:19 EDT 2006


On Wed, Aug 09, 2006 at 10:43:33AM -0400, Jean-Paul Calderone wrote:
> On Wed, 9 Aug 2006 14:19:09 +0200, Torsten Irländer <feldmatrix at gmx.de> wrote:
> >On Wed, Aug 09, 2006 at 04:43:19PM +0800, wang wei wrote:
> >>please have a look of fellow code.
> >>
> >> [...deleted code... with Queue q in protocol instance]
> >>
> >>My question is how can I get size of Queue q from another class when the
> >>program running.
> 
> I suspect you are perfectly aware of how to get the size of the Queue and
> that your actual problem is getting a reference to the protocol instance.
> 
> The answer here has little to do with Twisted specifically.  You just need
> to organize your code such that the reference is available where it is
> needed.
> 
> >
> >That is a question I'm also interested in a good answer. My proposal would be
> >to return the protocol object as a deferred. For me this works, but I'm not
> >sure if this is a good approach. I extended wang wei's code so that the
> >protocol data can be accessed by other classes.
> 
> This is a perfectly serviceable solution, although it may be more complex
> than is strictly necessary.

Well, I had supposed that, but I'm happy that my proposal isn't as
bad as I thought ;)

> >from twisted.internet import reactor, protocol, defer
> >
> >class echo(protocol.Protocol):
> >   def __init__(self):
> >       from Queue import Queue
> >       self.q = Queue()
> >
> >   def connectionMade(self):
> >       self.factory.deferred.callback(self)
> >
> >   def lineReceived(self, line):
> >       print line
> >       self.q.put(line)
> >
> >class echofactory(protocol.ServerFactory):
> >
> >   def __init__(self):
> >       self.deferred = defer.Deferred()
> >
> >   def buildProtocol(self, addr):
> >       p = echo()
> >       p.factory = self
> >       return p
> >
> >class runEcho:
> >   def connect(self):
> >       a = echofactory()
> >       a.deferred.addCallback(self.set_myprotocol)
> >       reactor.listenTCP(1024, a)
> >       reactor.run()
> >
> >   def set_myprotocol(self,proto):
> >       print "protocol ready!"
> >       self.proto = proto
> >       print self.proto.q
> >
> >r = runEcho()
> >r.connect()
> >
> >
> >Can anyone give some comments on this? I am at the very beginning
> >of twisted programming and I'm not sure if this is a good way to
> >access the protocol class from the outside.
> 
> For a single connection, twisted.internet.protocols.ClientCreator performs
> approximately the same task.  For multiple connections, you may want to
> eliminate the Deferred entirely and simply call a method with a well-known
> name.  For example:
> 
>    def connectionMade(self):
>        self.factory.setMyProtocol(self)
> 
> Or, to handle multiple simultaneous connections:
> 
>    def connectionMade(self):
>        self.factory.addProtocol(self)
> 
> 
>    def connectionLost(self, reason):
>        self.factory.removeProtocol(self)
> 
> There is an implementation of this tracking pattern in Twisted already,
> in fact.  Take a look at twisted.protocols.policies.WrappingFactory, which
> keeps a dictionary of protocol instances, updating it whenever a new
> connection is made or an old one lost.

Thanks again for your comment :)

best regards 
Torsten




More information about the Twisted-Python mailing list