【发布时间】: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>main.JSONProtocol 实例位于 0x969036c>
连接 2:StringIO.StringIO 实例位于 0x968ae2c>main.JSONProtocol 实例位于 0x969068c>
此外,每次我输入文本时,都会显示从其他连接输入的文本。 所以似乎出于某种奇怪的原因 StringIO() 实例是共享的,我是否遗漏了什么。我想我可以使用工厂通过 addr 分隔缓冲区并确保每个协议只使用自己的缓冲区,但不需要共享存储,我宁愿不跳过箍
谢谢。
【问题讨论】: