2

私は現在、メッセージ処理アプリケーションとして使用する python ツイスト サーバーを開発しています。私は奇妙な問題に遭遇しました。

サーバーへの get_POST を処理するクラスを指定し、受信したメッセージをさらに処理するクラスに渡します。

メッセージは、新しいメッセージがあるたびにインスタンス化されるオブジェクトのメンバーであるディクショナリに処理されます。ただし、(たとえば) メッセージにディクショナリの 10 項目が含まれていた後、エントリが 9 つしかないメッセージが処理されると、10 番目はディクショナリに残ります。

メッセージを処理する前に辞書を明示的にクリアすることで、これを回避できました。

d = {}

ただし、辞書がさらに処理された後にオブジェクトがスコープ外になり、ガベージ コレクションが行われ、新しいメッセージごとに再インスタンス化されるはずだったので、私は戸惑いました。オブジェクトがインスタンスではなく、メンバーをシングルトンのように保持しているか、メンバーが静的であるかのように動作しているようです。

通常のスコープ ポリシーは、ねじれたフレームワークの下でも同じように機能しますか?それとも、オブジェクトがスコープ外になったときに確実に GC されるようにするために、何か追加の操作を行う必要がありますか?

ありがとう!

-ジョー。

4

2 に答える 2

2

辞書を含むクラスをどのように初期化していますか? 次のようなものを使用したとします。

class YourClass(object):
     def __init__(self):
         self.d = {}

それはあなたの問題を解決するでしょう。すべてのメッセージでインスタンス化されるのではなく、代わりに Twisted フレームワークによってプールされて再利用される何らかのオブジェクトでない限り。クラスのメソッドにある種のログ出力を追加して__init__、実際にメッセージごとにインスタンス化されているかどうかを確認しましたか?

于 2012-04-26T18:10:00.730 に答える
1

クラス定義は次のようになっていると思います。

class MyCoolMessage(object):
    d={}
    def addMessage(self,incoming_msg):
        d['a']=incoming_msg[0]
        d['b']=incoming_msg[1]
        d['c']=incoming_msg[2]

これは、@ John Gaines Jr.が上で指摘したものとは異なり、彼のアプローチは正しいものです。クラスレベルではなく、 initでインスタンスごとの変数を初期化する必要があります。

の問題

class MyCoolMessage(object):
    d={}

セットアップでは、dのスコープは、不満ではなくクラスになります。クラスを開始しなくてもアクセスできる必要があります。

print (MyCoolMessage.d)
于 2012-04-26T18:16:53.230 に答える