[Twisted-Python] Help using XmlStreamFactory & XmlStream : XPathQuery error?
Phil Mayers
p.mayers at imperial.ac.uk
Thu Feb 21 06:31:40 EST 2008
>>
>> One solution is to have a difference instance for each connection and
>> to use
>> a bound method as the event handler. This gives you an obvious
>> per-instance
>> place to keep state and such - on the instance.
>
> Jean-Paul, sorry for the dumb question, when you mean a different
> instance, you mean a thread? What is a bound method? I'm fairly new to
> python and very new to twisted (as you can probably tell).
A bound method is a function on a class instance. e.g.:
>>> class A:
... def func(self):
... pass
...
>>> aa = A()
>>> A.func
<unbound method A.func>
>>> aa.func
<bound method A.func of <__main__.A instance at 0x2aaaaab423b0>>
A.func is the unbound method - it's a function object, defined in the
class, but the class is not instantiated so it's unbound.
aa.func is a bound version of A.func - it's bound to the instance "aa"
and will fill in the "self" argument when called.
Think about it like this:
When you use 1 thread per connection, your "state" is usually stored as
local variables inside a function i.e. on the stack.
When you use 1 thread for all connections, your "state" needs to be
attached to the connection e.g. as instance variables of the protocol or
an attached object.
So, you might do this:
from twisted.protocols import basic
from twisted.internet import protocol, reactor
class MyProto(basic.LineReceiver):
def lineReceived(self, line):
self.data.append(line)
def connectionLost(self, reason):
print "my data was", '\n'.join(self.data)
class MyFactory(protocol.ServerFactory):
protocol = MyProto
def buildProtocol(self, *pargs, **kwargs):
p = protocol.ServerFactory.buildProtocol(self, *pargs, **kwargs)
p.data = []
return p
reactor.listenTCP(8000, MyFactory())
reactor.run()
Relating to your other email - a similar technique works for more
complex things e.g.
class MyProto(...)
def dataReceived(self, data):
self.parser.push(data)
class MyFactory(...)
def buildProtocol(...)
p = ..
p.parser = XmlParser()
More information about the Twisted-Python
mailing list