2012-05-17 3 views
3

이 질문은 이전에 질문 한 질문의 연장입니다. Python Delegate Pattern - How to avoid circular reference? 답장을 읽은 후 제 질문을 명확히하기로했지만 별도로 게시하도록 요청되었습니다.파이썬의 가비지 수집은 모든 상황에서 순환 참조 객체의 교정을 보장 할 수 있습니까?

은 간다 :

  1. 파이썬 문서에서 통로 (아래 재생)을 garbaged 컬렉션이 원형 참조 오브젝트 보장되지 않는 상태. 내가 발견 한 게시물 here은 똑같은 것을 제안합니다. 그러나 나의 이전 질문에 대한 대답은 의견이 맞지 않는다. 그래서 내가 그 구절을 잘못 이해했거나 더 이상 놓친 부분이 이니?
  2. Alex Martelli의 질문에 대한 답변이 Should I worry about circular references in Python? 인 것처럼 약한 참조를 사용한다고 가정합니다. 회신에 언급 된 순환 참조 객체가 가비지 수집에 대한 오버 헤드를 완전히 피할 수 있습니까? 그렇다면 어떻게 작동합니까?

파이썬 문서에서 충돌 다음 통로 제안 관련 파이썬 문서 :

CPython의 구현 세부 사항 : CPython의 현재 주기적 연결된 쓰레기의 검출 지연 (옵션)와 참조 카운팅 방식을 사용하여, 대부분의 객체는 에 도달하자마자 수집하지만 은 순환 참조을 포함하는 가비지 을 수집하지 않을 것입니다. 순환 쓰레기 수집 제어에 대한 정보는 gc 모듈 의 설명서를 참조하십시오. 다른 구현이 다르게 작동하고 CPython이 변경 될 수 있습니다. 도달 할 수 없게 된 경우 (예 : 항상 파일을 닫음) 객체를 즉시 완료하는 데 을 의존하지 마십시오.

원래 형태의 절은 다음에서 찾을 수 있습니다. http://docs.python.org/reference/datamodel.html 굵게 설정은 내 것입니다.

미리 답변 해 주셔서 감사합니다.

답변

2

는 I는 그들이__del__방법을 정의하는 경우 순환 참조 개체 가장 중요한 이유는 디자인에 의해, 파이썬 결코 순환 참조 와 개체를 수집하지 않습니다 것을 수집 할을 보장 할 수 없습니다 있다고 생각 . 꽤 straightforward reason 있습니다 : 파이썬은 __del__() 방법을 실행하기에 안전한 순서를 추측하기 일반적으로는 불가능하기 때문에

파이썬은 자동적주기를 수집하지 않습니다.

나는이 순환 참조에 도달 할 수없는 물체가 감지되지 않을 수도 이유라고 말을 싫어 해요. GC의주기 탐지 메커니즘을 포기할 수있는 몇 가지 비정상적인 상황이있을 수 있습니다. 그러나 객체 중 하나에 __del__을 정의하지 않으면 일 가능성이 높으며입니다. 성능 문제가있는 경우 GC의 광범위한 디버깅 옵션을 사용하면됩니다.

+1

안녕하세요. 그래서 당신의 대답에서 순환 참조가 메모리 누출로 이어질 수 있다고 말할 수는 있지만 일반적으로 심각하지는 않습니다. 성능이 현저히 떨어지는 경우 디버거에서 알 수 있어야합니다. 의심의 이익을 감안할 때, 이전 게시물에 대한 답변은 아마도 귀하와 같은 정신을 지녔을 것입니다. 또한이 문제를 완전히 피하기 위해 약한 참조를 사용하여 사이클의 객체 중 하나를 참조하여 순환 참조를 중단 할 수 있습니다. – lightalchemist

1

원형 참조를 수집하는 것이 보장되지 않는다고 말하면 바로 그 의미입니다. 순환 참조가 포함 된 데이터 구조 일 때마다 참조 횟수는 항상 0이 아니므로 참조 집계만으로는 언제 삭제할지 결정할 수 없습니다. 반면에 순환 참조가 각 범위의 끝에 도달 한 후에는 시간이 많이 걸릴 것입니다. 그것은 0이 아닌 참조 카운트를 가진 모든 객체의 관계를 분석하는 것을 포함합니다.

그렇긴해도 일반적으로 문제가 있다고 생각하지 않습니다. 가벼운 스크립트의 경우 무시할 수 있습니다. 다른 사람들을 위해 C에서와 같이 범위 끝에서 파일을 닫거나 순환 참조를 제거하더라도 여전히 정리 작업을 수행해야하지만 여전히 C만큼 지저분하지는 않습니다.

문제가되면 각 데이터 개체를 완료하기 전에 순환 참조를 제거하십시오.

+5

약한 문구를 사용하십시오. –