2012-03-20 2 views
4

참조 카운트가 0에 도달 한 후 얼마나 빨리 __del__ 메서드가 호출됩니까? 다른 사용 코드가 실행되기 전에 즉시 완료 될 것이라고 약속합니까? 또는 각각의 구현이 원하는대로 수행 할 수 있습니다. __del__의 호출을 임의로 길게 지연시킬 수 있습니까?참조 횟수가 0으로 떨어지면 얼마나 빨리`__del__`이 호출됩니까?

프로그램이 종료 될 때 상황을 무시하십시오. (주어진 블록의 마지막 문장이 완료되고 스택이 비어 있음을 의미한다고 가정합니다). 이 경우에는 __del__에 대한 약속이 없음을 알고 있습니다. 그것은 전혀 불리지 않을 수도 있습니다.

또한 참조 횟수가주기 등으로 인해 0이 아닌 것으로 알고 있습니다. 여기에 대해 우려하지 않습니다. (그것에 대해 별도의 질문을하고 있습니다.)

+3

"참조 횟수"라고 말하면 이미 가정을하고 있습니다. –

+1

구현을 고려하는 경우 ** 큰 뚱뚱한 빨간색 경고 **를 먼저 읽으십시오. http://docs.python.org/reference/datamodel.html#object.__del__ – ThiefMaster

+0

기본적으로 '__del__' http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx – SingleNegationElimination

답변

11

파이썬은 __del__이 호출 될 때 어떤 보증도하지 않으며 은 모두이 호출되는지 여부를 보증하지 않습니다. 그렇기 때문에 객체가 참조주기의 일부인 경우 __del__ 메서드가 호출되지 않을 것입니다. 왜냐하면주기가 전체적으로 정리 되더라도 파이썬은주기를 중단 할 위치를 결정할 방법이없고 __del__ 메소드 (있는 경우)를 호출해야합니다. __del__의 오히려 기발한 의미 때문에 (__del__를 호출하기 위해 객체의 refcount가 일시적으로 증가하고 __del__ 메소드는 다른 곳에 참조를 저장하여 객체의 파괴를 막을 수 있습니다.) 다른 구현에서 일어나는 일은 사마귀. (I는 현재 자이 썬에서 정확한 세부 사항을 기억하지 않는다, 그러나 그것은 과거에 몇 번 변경되었습니다.) CPython과에, 경우는이 레퍼런스 카운트 자마자라고,라고 __del__ 말했다

제로로 떨어진다 (refcount로는 __del__ 방법이라고 유일한 방법이며, 실제 refcount는이 변경 될 때 CPython과는 __del__를 호출하는 유일한 기회이기 때문이다.) 만약 당신이 __del__를 사용해야하는 유일한 이유에 대해

+2

기본적으로 묻는다면하지 마십시오. –

+0

'gc' 모듈은 참조주기를 깨뜨리기위한 것입니다. –

+1

'gc' 모듈은'__del__' 메쏘드를 가진 객체와 관련된 레퍼런스 사이클을 깨뜨릴 수 없습니다. 대신'gc.garbage'에 넣고 잊어 버립니다. 당신은'gc.garbage'를 통해 갈 수 있고, 당신이 그들을 깨는 법을 안다면 그 사이클을 스스로 끊을 수 있습니다,하지만'gc' 모듈은 당신을 위해 그것을하지 않을 것입니다. –

3

CPython object.__del__ 문서를 읽으십시오. 이것은 무엇을 말해야하는지에 대해 말하지만 구현에 따라 다릅니다. 대부분의 다른 Python 구현은 refcounting을 사용하지 않으므로 기능을 위해 그런 시간에 (심지어 전혀 호출하지 않고) 호출되는 것에 의존해서는 안됩니다. 파괴시에 호출된다. 구현 간에는 다릅니다. —.

5

는 돕는 것입니다 가비지 컬렉터가 더 많은 쓰레기를 수집합니다. 예를 들어, 실행중인 프로세스에 공유 라이브러리를 연결하는 ctypes 모듈을 구현하는 경우 마지막 참조가 수집 될 때 해당 라이브러리를 언로드하여 해당 주소 공간을 다른 용도로 사용할 수 있도록하는 것이 좋습니다.

다른 종류의 리소스를 관리하려면 가비지 수집기와 관련이없는 것이 좋습니다. 이를위한 올바른 도구는 context managers입니다. 가변 범위가 RAII에 사용되는 C++ 또는 Ada와 같은 언어와 달리 Python은 및 __exit__ 메소드가있는 객체와 함께 with 문을 사용합니다.

노골적인 암시보다 낫다 :

>>> x = file("foo", 'w') 
>>> x.closed 
False 
>>> with x: 
...  x.write("bar") 
... 
>>> x.closed 
True 

이것은 또한 파이썬의 젠의 관점에서 가치가있다 : 많은 파이썬에 내장 유형이 실제로 발생 확실히 마무리 단계를 만들기 위해이 정확한 메커니즘을 사용하여 .

클린업이 발생하고 있음이 분명하기 때문에 그렇게 명시 적으로 기록됩니다. 어떤 숨겨진 변수 (PyPy 또는 IronPython이나 자이 썬에서 존재하지 않는 참조 카운트가 있다면)가 특정 값에 도달했을 때 "마술처럼"발생하는 정리보다 훨씬 좋습니다.

+1

Weakref 콜백은 예방하지 못하기 때문에'__del__' 메소드가 제안하는 종류의 정리를 구현하는 훨씬 더 좋은 방법입니다 순환 정화. '__del__'이 존재하는 유일한 이유는 weakref뿐만 아니라 non-refcount 파이썬 구현에 대한 고려가 있기 때문입니다. –

관련 문제