Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扭曲python垃圾收集_Python_Garbage Collection_Twisted - Fatal编程技术网

扭曲python垃圾收集

扭曲python垃圾收集,python,garbage-collection,twisted,Python,Garbage Collection,Twisted,我目前正在开发一个python twisted服务器,用作消息处理应用程序。我遇到了一个奇怪的问题 我指定我的类来处理到服务器的get_POST,并将收到的消息传递给一个类,该类将进一步处理它 消息处理到一个字典中,该字典是一个对象的成员,每当有新消息时,该对象就会被实例化。但是,在(例如)一条包含10个字典项的消息之后,当处理一条只有9个条目的消息时,第10条仍将在字典中 我已经能够通过在处理消息之前明确清除字典来解决此问题,例如: d={} 然而,我感到困惑,因为该对象应该已经超出范围,在进

我目前正在开发一个python twisted服务器,用作消息处理应用程序。我遇到了一个奇怪的问题

我指定我的类来处理到服务器的get_POST,并将收到的消息传递给一个类,该类将进一步处理它

消息处理到一个字典中,该字典是一个对象的成员,每当有新消息时,该对象就会被实例化。但是,在(例如)一条包含10个字典项的消息之后,当处理一条只有9个条目的消息时,第10条仍将在字典中

我已经能够通过在处理消息之前明确清除字典来解决此问题,例如:

d={}

然而,我感到困惑,因为该对象应该已经超出范围,在进一步处理字典并在每一条新消息上重新实例化之后,就会被垃圾收集。它似乎表现得好像对象不是实例,并将成员保留为单例,或者成员是静态的

在twisted框架下,正常的作用域策略的行为是否相同,或者我是否需要做一些额外的事情来确保对象在超出范围时是GC的

谢谢


-joe.

如何初始化包含字典的类?我认为,如果你使用了以下内容:

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

它会解决你的问题。除非它是某种对象,不是在每条消息上都实例化,而是由Twisted框架进行池化和重用。您是否尝试过将某种日志输出添加到类的
\uuuu init\uuuuu
方法中,以查看它是否实际上是每个消息实例化的?

我怀疑您的类定义如下所示:

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中而不是在类级别初始化per insatnce变量

问题在于

class MyCoolMessage(object):
    d={}
设置是d的作用域成为类而不是insatnce,它甚至应该是可访问的,而无需通过初始化类

print (MyCoolMessage.d)

是的,它被实例化了,我对日志记录很敏感,所以我能够排除调用其他模块的可能性。基本上,我最终按照您的建议做了,并将ClassName.d={}放在init中。但是,当对象的实例不在范围内时,它却不是GCd,这仍然困扰着我。谢谢。这就是你的问题,Classname.var创建了一个类变量,将self.var放入
\uuuu init\uuuu
中创建了一个实例变量。如果你包含了一点代码来说明你的方法(特别是如果它实际上是一个实例变量的话),这将是一个非常简单的问题。由于省略了这些信息,这是一个“猜猜看不见的程序出了什么问题”的问题:(感谢Jean Paul,我们能够在下面解决这个问题,这与我对类和实例范围变量的误解有关,而与twisted无关。