복붙노트

[PYTHON] urllib.urlopen () 다음에 close ()를 호출해야합니까?

PYTHON

urllib.urlopen () 다음에 close ()를 호출해야합니까?

저는 Python을 처음 사용하고 다른 사람의 코드를 읽습니다.

urllib.urlopen () 뒤에 urllib.close ()를 써야합니까? 그렇지 않으면 연결이 누출 될 것입니다. 맞습니까?

해결법

  1. ==============================

    1.close 메소드는 urllib.urlopen의 결과에서 호출되어야하며, urllib.close (존재하지 않음)에 대해 생각하는 것처럼 urllib 모듈 자체에서는 호출되지 않습니다.

    close 메소드는 urllib.urlopen의 결과에서 호출되어야하며, urllib.close (존재하지 않음)에 대해 생각하는 것처럼 urllib 모듈 자체에서는 호출되지 않습니다.

    최선의 방법 : x = urllib.urlopen (u) 대신에 다음을 사용하십시오 :

    import contextlib
    
    with contextlib.closing(urllib.urlopen(u)) as x:
       ...use x at will here...
    

    with 문과 닫는 컨텍스트 관리자는 예외가있는 경우에도 적절한 종료를 보장합니다.

  2. ==============================

    2.@Peter와 마찬가지로, 범위를 벗어난 열린 URL은 가비지 수집 대상이됩니다.

    @Peter와 마찬가지로, 범위를 벗어난 열린 URL은 가비지 수집 대상이됩니다.

    그러나 urllib.py는 다음을 정의합니다.

     def __del__(self):
            self.close()
    

    즉, 해당 인스턴스의 참조 카운트가 0에 도달하면 __del__ 메소드가 호출되고 close 메소드가 호출됩니다. 참조 카운트가 0에 도달하는 가장 일반적인 방법은 인스턴스가 범위를 벗어나게하는 것입니다.하지만 명시 적으로 del x를 일찍 중지하는 것은 없습니다 (단, __del__을 직접 호출하지는 않지만 참조를 감소시킵니다). 하나씩 계산).

    분명히 리소스를 명시 적으로 닫는 것이 좋은 스타일입니다. 특히 응용 프로그램이 너무 많은 리소스를 사용하는 위험을 감수 할 때 특히 그렇습니다. 그러나 Python은 자동으로 참조를 유지하는 것 같은 재미있는 일을하지 않으면 자동으로 정리합니다. 더 이상 필요하지 않은 인스턴스로

  3. ==============================

    3.엄밀히 말하면 이것은 사실입니다. 그러나 실제로는 urllib가 범위를 벗어나면 자동 가비지 컬렉터에 의해 연결이 닫힙니다.

    엄밀히 말하면 이것은 사실입니다. 그러나 실제로는 urllib가 범위를 벗어나면 자동 가비지 컬렉터에 의해 연결이 닫힙니다.

  4. from https://stackoverflow.com/questions/1522636/should-i-call-close-after-urllib-urlopen by cc-by-sa and MIT license