2012-04-26 17 views
2

私は現在、メッセージ処理アプリケーションとして使用するpython twisted serverを開発中です。私は奇妙な問題に出くわしました。ツイストされたpythonのガベージコレクション

私はサーバにget_POSTを処理するためにmyクラスを指定し、受け取ったメッセージをさらに処理するクラスに渡します。

メッセージは、新しいメッセージが存在するたびにインスタンス化されるオブジェクトのメンバーである辞書に処理されます。しかし、(例えば)メッセージが辞書のための10個の項目を含む後に、9個の項目のみを有するメッセージが処理されると、10番目は依然として辞書内にある。

私は明示的に例えば、メッセージを処理する前に辞書をクリアすることによってこの問題を回避することができました:オブジェクトが出ていたはずなので

dが= {}

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

通常のスコープポリシーは、ねじれたフレームワークの下では同じように動作しますか、スコープから外れるとオブジェクトがGCされるようにするために何か追加が必要ですか?

ありがとうございます!

-joe。

+1

を通じてクラスの開始なしでもづけしなければなりません。この非常にされているだろう(特に実際にはhttp://sscce.org/の場合)あなたのアプローチを照らし出すコードを少し入れておけば簡単に質問できます。この情報を省略すると、これは「見えないプログラムに何が間違っているのか」という疑問です。 : –

+0

Jean-Paul、ありがとうございました。私たちはこれを以下に解くことができました。クラスとインスタンススコープの変数の誤解とは関係ありませんでした。 –

答えて

2

辞書を含むクラスをどのように初期化していますか?

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

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

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

これは@ジョンゲインズ・ジュニアは、上記に指摘し、彼のアプローチが正しいものであるものとは異なります。

+0

yehはインスタンス化されています。私はロギングについて神経症でしたので、他のモジュールが呼び出されるのを除外することができました。基本的に私はあなたが提案したものをやり遂げて、ClassName.d = {}を__init__の中に入れました。しかし、オブジェクトのインスタンスがスコープから逸脱しているときにGCdになっていないことは、まだ気になります。ありがとう。 –

+0

これはあなたの問題です。Classname.varはクラス変数を作成し、self.varを '__init__'の中に入れてインスタンス変数を作成します。 –

+0

これは問題ありません。ありがとう。 –

1

は、私はあなたのクラス定義は、このような何かを見ていると思われます。クラスレベルではなくのinsatnce変数ごとに初期化する必要があります。

class MyCoolMessage(object): 
    d={} 

設定に問題をdの範囲がinsatnceではなくクラスになることで、それは

print (MyCoolMessage.d) 
関連する問題