扭曲的python协议之间的数据分离

时间:2013-03-21 03:28:09

标签: python protocols twisted

根据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分隔缓冲区,并确保每个协议只使用自己的缓冲区,但不需要共享存储我宁愿不跳过篮球

谢谢。

1 个答案:

答案 0 :(得分:3)

此:

class JSONCollector():
    char_buffer = StringIO.StringIO()

似乎是一个错误,也是你麻烦的根源。相反,试试这个:

class JSONCollector():
    def __init__(self):
        self.char_buffer = StringIO.StringIO()

否则,您为整个类类型创建一个char_buffer,而不是每个实例一个。{/ p>