【问题标题】:twisted python separation of data between protocols扭曲的python协议之间的数据分离
【发布时间】:2013-03-10 10:57:33
【问题描述】:

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

简单来说,我已经定义了一个类,每个协议都将用于状态

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(self))

我得到以下信息:

连接 1:StringIO.StringIO 实例位于 0x968ae2c>ma​​in.JSONProtocol 实例位于 0x969036c>

连接 2:StringIO.StringIO 实例位于 0x968ae2c>ma​​in.JSONProtocol 实例位于 0x969068c>

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

谢谢。

【问题讨论】:

    标签: python protocols twisted


    【解决方案1】:

    这个:

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

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

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

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

    【讨论】:

    • 这只是尴尬
    猜你喜欢
    • 2012-09-23
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多