Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 协议之间的数据分离_Python_Protocols_Twisted - Fatal编程技术网

Python 协议之间的数据分离

Python 协议之间的数据分离,python,protocols,twisted,Python,Protocols,Twisted,据 每次建立连接时都会创建一个新的协议实例,但我观察到两者之间存在某种数据共享 简单地说,我定义了一个类,每个协议都将使用它来表示状态 class JSONCollector(): char_buffer = StringIO.StringIO() ... def process_data(self, data): ... self.char_buffer.write(char) 协议实例化了它 class JSO

据 每次建立连接时都会创建一个新的协议实例,但我观察到两者之间存在某种数据共享

简单地说,我定义了一个类,每个协议都将使用它来表示状态

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\u collector.char\u buffer)) self.transport.write(str(self))

我得到以下信息:

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

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

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

谢谢。

这是:

class JSONCollector():
    char_buffer = StringIO.StringIO()
似乎是个错误,也是你麻烦的根源。相反,请尝试以下方法:

class JSONCollector():
    def __init__(self):
        self.char_buffer = StringIO.StringIO()
否则,您将为整个类类型创建一个
char\u缓冲区,而不是每个实例一个。

这是:

class JSONCollector():
    char_buffer = StringIO.StringIO()
似乎是个错误,也是你麻烦的根源。相反,请尝试以下方法:

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

否则,您将为整个类类型创建一个
char\u buffer
,而不是为每个实例创建一个