根据twisted documentation 每次建立连接时都会创建一个新的Protocol实例,但我观察到两者之间的某种数据共享。
简单地说,我已经定义了一个类,每个协议将用于状态
class JSONCollector():
char_buffer = StringIO.StringIO()
...
def process_data(self, data):
...
self.char_buffer.write(char)
协议实例化它
class JSONProtocol(protocol.Protocol):
def __init__(self):
self.json_collector = JSONCollector()
def dataReceived(self, data):
self.json_collector.process_data(data)
self.transport.write(str(self))
然而,当我向dataReceived添加以下语句时,每个连接似乎都获得了相同的JSONCollector实例 self.transport.write(STR(self.json_collector.char_buffer)) self.transport.write(STR(个体))
我得到以下内容:
连接1:StringIO.StringIO实例位于0x968ae2c>< main .JSONProtocol实例位于0x969036c>
连接2:位于0x968ae2c>< main 的StringIO.StringIO实例。位于0x969068c的.JSONProtocol实例>
每当我输入文本时,都会显示从其他连接输入的文本。 所以似乎由于一些奇怪的原因,StringIO()实例被共享,我错过了什么。我想我可以使用工厂通过addr分隔缓冲区,并确保每个协议只使用自己的缓冲区,但不需要共享存储我宁愿不跳过篮球
谢谢。
答案 0 :(得分:3)
此:
class JSONCollector():
char_buffer = StringIO.StringIO()
似乎是一个错误,也是你麻烦的根源。相反,试试这个:
class JSONCollector():
def __init__(self):
self.char_buffer = StringIO.StringIO()
否则,您为整个类类型创建一个char_buffer
,而不是每个实例一个。{/ p>