2009-04-17 4 views
0

link text내가는 "델 astrd"를 수행 할 때</p> <p>그래서, 참조 계수가 0이되고 astrd는 GC에 의해 수집됩니다 참조 카운트의 개념을 가지고

sys.getrefcount 계속? link text

one.py :

데프 ABC() :

print "Hello" 
print "123" 
print '345' 

two.py :

은 내가 어제의 질문 이후에 개발 된 샘플 codes.These 코드입니다
import one 
#reload(one) 

#def defg(): 

one.abc() 

three.py :

내가 3.py에서 한 것은 옳았습니까? 불필요한 단계가 있습니까? 그렇다면 이유는 무엇입니까?

도와주세요.

답변

6

나는 메모리가 refcount는 제로에 도달하는 순간을 해제 자동으로되어 있다고 생각합니다. GC는 관련이 없습니다.

파이썬 GC는 선택 사항이며 참조주기가있는 도달 할 수없는 객체가있는 경우에만 사용됩니다. 실제로 프로그램이 참조주기를 생성하지 않는다고 확신하는 경우 gc.disable()으로 전화 할 수 있습니다. 원래의 질문에 관해서는

:

  • 당신이 del astrd

    , 당신은 로컬 네임 스페이스에서 개체에 대한 참조 (어떤 astrd 참조를)을 astrd의 바인딩을 제거합니다.
  • refcount가 0 인 경우 개체에서 사용하는 메모리가 해제됩니다.
  • 따라서 del은 개체를 삭제하지 않으며 참조를 바인딩 해제합니다. 객체를 삭제하면 참조를 바인딩 해제하여 refcount가 0이되는 경우 발생하는 부작용입니다.

위의 내용은 CPython에만 해당됩니다. Jython과 IronPython은 JVM/CLR GC 메커니즘을 사용하며 refcounting을 전혀 사용하지 않습니다.

편리한 gc.get_objects은 파이썬 인터프리터에서 추적 한 모든 객체 인스턴스의 목록을 반환합니다. 예 :

 
import gc 

class test(object): 
    pass 

def number_of_test_instances(): 
    return len([obj for obj in gc.get_objects() if isinstance(obj, test)]) 

for i in range(100): 
    t = test() 

print "Created and abandoned 100 instances, there are now", \ 
    number_of_test_instances(), \ 
    "instances known to the python interpreter." 

# note that in normal operation, the GC would 
# detect the unreachable objects and start 
# collecting them right away 
gc.disable() 

for i in range(100): 
    t = test() 
    t.t = t 

print "Created and abandoned 100 instances with circular ref, there are now", \ 
    number_of_test_instances(), \ 
    "instances known to the python interpreter." 

gc.collect() 
print "After manually doing gc.collect(), there are now", \ 
    number_of_test_instances(), \ 
    "instances known to the python interpreter." 

이 프로그램을 실행을 제공합니다

 
Created and abandoned 100 instances, there are now 1 instances known to the python interpreter. 
Created and abandoned 100 instances with circular ref, there are now 100 instances known to the python interpreter. 
After manually doing gc.collect(), there are now 1 instances known to the python interpreter. 
+0

m 예를 들어 코드를 첨부하여 내 질문을 편집하십시오. 을 말해 주시겠습니까? – user46646

+0

코드에서 수행하려는 작업은 무엇입니까? – codeape

+0

제 어제의 질문에 따라 수입품을 지우려고했습니다 두 번째 링크를 붙였습니다 – user46646

0

당신은 당신이 무엇을하고 있는지에 관해서는 몇 가지 배경을 줄 수 있을까요? del을 명시 적으로 사용하는 이유는 드러내고 싶지 않은 것의 네임 스페이스를 정리하는 것 이외의 다른 변수에 대해서는 거의 없습니다. del file_name으로 전화를 걸거나 gc.collect()을 (를) 호출하는 이유를 모르겠습니다. (del sys.modules[filename]은 괜찮습니다. del의 다른 용도입니다.)

오브젝트가 finalize되는 정확한 시간 (예 : file_name과 같은 문자열)이 맞지 않으면 변수가 범위를 벗어나게 할 수 있습니다. 기능이 완료되면 수집되고 그때까지 아무런 해가 없습니다. 이러한 변수에 수동으로 del을 호출하면 코드가 복잡해집니다.

즉석 파일 (예 : 열린 파일 또는 잠금 장치)을 필요로하는 개체의 경우 가비지 수집기에 의존해서는 안되며 이러한 개체를 즉시 수집하지 않을 수도 있습니다. 표준 C 파이썬 구현에서는 그렇게되지만 Jython이나 IronPython에서는 그렇지 않으므로 보장되지 않습니다. 대신 close을 호출하거나 새로운 with 구문을 사용하여 이러한 개체를 명시 적으로 정리해야합니다.

유일한 다른 이유는 매우 많은 양의 메모리가 할당되어 있고, 변수를 참조하는 변수가 자연스럽게 범위를 벗어나기 전에 완료되었다는 신호를 보내고 싶다는 것입니다.

귀하의 예제는 이러한 상황 중 하나에 맞지 않는 것처럼 보이므로 수동으로 왜 가비지 컬렉터를 수동으로 호출하는지 확신 할 수 없습니다.