2012-04-26 66 views
2

我目前正在開發一個python扭曲的服務器用作消息處理應用程序。我遇到了一個奇怪的問題。扭曲的python垃圾回收

我指定我的類來處理服務器的get_POST,並將接收到的消息傳遞給進一步處理它的類。

消息處理成一個字典,該字典是每次有新消息時被實例化的對象的成員。然而,在(例如)一條消息包含10個字典的消息之後,當處理僅有9個條目的消息時,第10個將仍然在字典中。

我已經能夠解決此通過處理消息如之前明確地清理出的詞典:

d = {}

不過,我很困惑,因爲對象應該已經出來了在字典進一步處理後收集的範圍和垃圾,並重新實例化每一條新消息。它似乎表現得像對象不是一個實例,並且將成員保存爲單例,或者成員是靜態的。

在扭曲的框架下,正常的範圍策略的行爲是否相同,還是我需要額外做些事情來確保對象在超出範圍時進行GC'd操作?

謝謝!

-joe。

+1

是沒有階級的啓動甚至入店這本來是一個很如果你包含一些代碼來說明你的方法(特別是如果它實際上是一個http://sscce.org/),那麼這個問題很容易。在省略了這些信息的情況下,這是「猜測隱形程序有什麼問題」的問題。 :( – 2012-04-27 00:00:08

+0

感謝Jean-Paul,我們能夠在下面看到這一點,它與我對類和實例範圍變量的誤解有關,並且與扭曲無關 – 2012-04-30 18:54:31

回答

2

你如何初始化包含字典的類?我會想,如果你沿線使用的東西:

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

它會解決你的問題。除非它是某種沒有在每條消息上實例化的對象,而是由Twisted框架進行混合和重用。你有沒有嘗試在你的類的__init__方法中添加某種類型的日誌輸出,以查看它是否實際上正在爲每個消息實例化?

+0

你被實例化了,我一直在記錄神經,所以我能夠排除其他模塊被稱爲。基本上,我最終做了你的建議,並將其放在__init__中的ClassName.d = {}中。但是,它仍然困擾我,當它應該超出範圍時,該對象的實例不在GCd中。謝謝。 – 2012-04-26 18:13:00

+0

這就是你的問題,Classname.var創建一個類變量,將self.var放在'__init__'中創建一個實例變量。 – 2012-04-26 18:25:00

+0

好的,就是這樣,而且更有意義。謝謝。 – 2012-04-26 18:30:30

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] 

這是比@約翰小蓋恩斯上面指出,他的做法是正確的一個不同。您應該初始化init中的每個insatnce變量,而不是在課程級別。

class MyCoolMessage(object): 
    d={} 

設置的問題是,d的範圍成爲類,而不是insatnce,它應該通過

print (MyCoolMessage.d)