2012-04-26 3 views
2

В настоящее время я разрабатываю витой сервер python для использования в качестве приложения обработки сообщений. Я столкнулся с какой-то странной проблемой.скрученная сборка мусора python

Я определяю свой класс для обработки get_POST на сервере и передает полученное сообщение классу, который его обрабатывает.

Сообщение обрабатывается в словаре, который является членом объекта, который создается при каждом появлении нового сообщения. Однако после (например) сообщение содержало 10 элементов для словаря, когда обрабатывается сообщение только с 9 записями, 10-е будет по-прежнему находиться в словаре.

Я был в состоянии работать вокруг этого явно убирая словаря перед обработкой сообщений, например:

d = {}

Однако я озадачен, потому что объект должен быть вне объема и мусора, собранных после того, как словарь был дополнительно обработан, и повторно подтвержден на каждое новое сообщение. Кажется, что он действует как объект, а не является экземпляром и сохраняет членов, как если бы он был одиночным, или члены были статическими.

Выполняют ли обычные политики определения области видимости в рамках скрученной структуры или мне нужно сделать что-то дополнительное, чтобы гарантировать, что объекты GC'd, когда они выпадают из области видимости?

Спасибо!

-joe.

+1

Это было бы очень простой вопрос, если бы вы включили немного кода, освещающего ваш подход (особенно, если на самом деле это был http://sscce.org/). Когда эта информация опущена, это вопрос «догадайтесь, что случилось с невидимой программой». :( –

+0

Спасибо, Жан-Поль, мы смогли понять это ниже, и это связано с моим непониманием переменных класса и экземпляра, и не имеет ничего общего с искаженным. –

ответ

2

Как вы инициализируете класс, содержащий словарь? Я бы подумал, что если вы использовали что-то вроде:

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

Это решит вашу проблему. Если это не какой-то объект, который не создается при каждом сообщении, а вместо этого объединен и повторно используется структурой Twisted. Вы пытались добавить какой-то выход журнала в метод __init__ вашего класса, чтобы убедиться, что он фактически создается для каждого сообщения?

+0

yeh, его экземпляр и i ' ve невротик о протоколировании, поэтому я смог исключить другие вызываемые модули.в основном я закончил делать то, что вы предложили, и поместить в ClassName.d = {} внутри __init__. Но мне все еще мешает, что экземпляр объекта не является GCd, когда он должен выпадать из области видимости. Благодарю. –

+0

Это ваша проблема, Classname.var создает переменную класса, при этом self.var внутри '__init__' создает переменную экземпляра. –

+0

ОК, вот и все, и имеет больше смысла. Благодарю. –

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 Гейнс младший указал выше, и его подход является правильным. Вы должны инициализировать переменные insatnce в init, а не на уровне класса.

Проблема с

class MyCoolMessage(object): 
    d={} 

установки является то, что объем д становится классом, а не insatnce, она должна быть даже подъезд без инициации класса через

print (MyCoolMessage.d) 
Смежные вопросы