0

根据扭曲的文档 ,每次建立连接时都会创建一个新的协议实例,但是我正在观察两者之间的某种数据共享。

简而言之,我已经定义了一个类,每个协议将用于状态

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 self.transport.write(str(self.json_collector.char_buffer)) self.transport.write(str(self)) 时,每个连接似乎都获得了相同的 JSONCollector 实例

我得到以下信息:

连接 1:0x968ae2c 处的 StringIO.StringIO 实例>< 0x969036c 处的.JSONProtocol 实例>

连接 2:0x968ae2c 处的 StringIO.StringIO 实例>< 0x969068c 处的.JSONProtocol 实例>

此外,每次我输入文本时,都会显示从其他连接输入的文本。所以似乎出于某种奇怪的原因 StringIO() 实例是共享的,我是否遗漏了什么。我想我可以使用工厂通过 addr 分隔缓冲区并确保每个协议只使用自己的缓冲区,但不需要共享存储,我宁愿不跳过箍

谢谢你。

4

1 回答 1

3

这:

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

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

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

否则,您char_buffer将为整个类类型制作一个,而不是每个实例一个。

于 2013-03-21T04:24:38.283 回答