0

ねじれたドキュメントによると 、接続が確立されるたびに新しい Protocol インスタンスが作成されますが、2 つの間である種のデータ共有が見られます。

簡単に言えば、各プロトコルが状態に使用するクラスを定義しました

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インスタンスごとに 1 つではなく、クラス タイプ全体に対して 1 つ作成されます。

于 2013-03-21T04:24:38.283 に答える