programing tip

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

itbloger 2020. 11. 5. 07:45
반응형

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


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

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


close방법은 호출해야 결과urllib.urlopen, 아니urllib(당신이 언급으로 모듈 자체에 대한 당신이있는 거 생각으로 urllib.close- 어떤 존재하지 않음).

가장 좋은 방법 : x = urllib.urlopen(u)etc 대신 다음을 사용하십시오.

import contextlib

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

with문 및 closing컨텍스트 매니저, 심지어 예외의 존재에 적절한 폐쇄를 보장합니다.


@Peter가 말했듯이 범위를 벗어난 열린 URL은 가비지 수집 대상이됩니다.

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

 def __del__(self):
        self.close()

, 해당 인스턴스에 대한 참조 횟수가 0도달하면 해당 __del__메서드가 호출되므로 해당 close메서드도 호출됩니다. 참조 횟수가 0에 도달하는 가장 "정상적인"방법은 단순히 인스턴스가 범위를 벗어나도록하는 것입니다.하지만 명시 적 del x초기 단계에서 엄격하게 막을 수 는 없습니다 (그러나 직접 호출하지 않고 __del__참조 횟수를 1만큼 감소시킵니다). ).

특히 애플리케이션에서 언급 된 리소스를 너무 많이 사용할 위험이있는 경우 리소스를 명시 적으로 닫는 것은 확실히 좋은 스타일이지만 (순환?) 참조를 유지하는 것과 같은 재미있는 작업을 수행하지 않으면 Python 자동으로 정리됩니다. 더 이상 필요하지 않은 인스턴스에.


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


당신은 기본적으로 어떻게 사용할 때 명시 적으로 가까운 연결에 필요 IronPython의를 . 범위를 벗어나는 자동 닫기는 가비지 수집에 의존합니다. 가비지 수집이 너무 오래 실행되지 않아 Windows 소켓이 부족한 상황이 발생했습니다. 나는 고주파로 웹 서버를 폴링하고 있었다 (즉, IronPython과 연결이 허용하는 최대 7Hz). PerfMon에서 "설정된 연결"(즉, 사용중인 소켓)이 올라가고 올라가는 것을 볼 수 있습니다. 해결책 gc.collect()은를 호출 할 때마다 호출하는 것이 었습니다 urlopen.

참고 URL : https://stackoverflow.com/questions/1522636/should-i-call-close-after-urllib-urlopen

반응형