2012-04-26 5 views
2

현재 메시지 처리 응용 프로그램으로 사용할 파이썬 트위스트 서버를 개발 중입니다. 이상한 문제를 보았습니다.비뚤림 파이썬 가비지 수집

서버에 get_POST를 처리하고 수신 된 메시지를 처리하는 클래스에 전달하기 위해 클래스를 지정합니다.

메시지는 새 메시지가있을 때마다 인스턴스화되는 개체의 구성원 인 사전을 처리합니다. 그러나 예를 들어 메시지에 사전에 대해 10 개의 항목이 포함 된 경우 9 개의 항목 만있는 메시지가 처리 될 때 10 번째 항목은 여전히 ​​사전에 있습니다.

나는 명시 적으로 메시지 예를 들어 처리하기 전에 사전을 취소하여이 문제를 해결 할 수있었습니다

: 개체가 밖으로 있었어야 때문에 = {}

는 그러나, 나는 의아해 해요

D를 사전이 추가로 처리 된 후에 수집 된 스코프 및 가비지의 모든 새 메시지에 대해 다시 인스턴스화됩니다. 객체가 인스턴스가 아니고 멤버를 마치 싱글 톤인 것처럼 유지하거나 멤버가 정적 인 것처럼 보이는 것 같습니다.

트위스트 프레임 워크에서 정상적인 범위 지정 정책이 동일하게 작동합니까 아니면 범위를 벗어난 경우 개체가 GC 화되도록 추가 작업을해야합니까?

감사합니다.

-joe.

+1

을 통해 클래스의 초기화없이 심지어 accesible해야이 매우했을 것이다 귀하의 접근 방식을 밝히는 약간의 코드가 포함되어 있다면 쉽게 질문 할 수 있습니다 (특히 실제로 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

예, 인스턴스가 생성되었습니다. 내가 로깅에 신경질 적이되어서 다른 모듈이 호출되는 것을 배제 할 수있었습니다.기본적으로 나는 당신이 제안한 일을 끝내고 ClassName.d = {} 안에 __init__을 넣습니다. 그러나 그것은 여전히 ​​객체의 인스턴스가 범위를 벗어나야 할 때 GCd가 아니라는 것을 나에게 귀찮게합니다. 감사. –

+0

이것이 문제입니다. Classname.var는 클래스 변수를 만들고,'__init__ '안에 self.var를 넣어 인스턴스 변수를 만듭니다. –

+0

오케이, 그게 전부이며 훨씬 더 의미가 있습니다. 감사. –

1

나는 당신의 클래스 정의 이런 식으로 뭔가를 보인다고 생각한다. 클래스 레벨이 아닌 초기화에서 insatnce 변수마다 초기화해야합니다.

class MyCoolMessage(object): 
    d={} 

설정의 문제는 D의 범위는 insatnce보다는 클래스 될 것입니다, 그것은

print (MyCoolMessage.d)