2012-04-26 154 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)