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
'programing tip' 카테고리의 다른 글
Common Lisp에서 eq, eql, equal 및 equalp의 차이점은 무엇입니까? (0) | 2020.11.05 |
---|---|
Spotify 데스크톱 애플리케이션을 개발하는 데 어떤 언어 또는 기술이 사용 되었습니까? (0) | 2020.11.05 |
jQuery에서 여러 ID 처리 (0) | 2020.11.05 |
치명적 : 작업 트리 디렉토리 'kivy'를 만들 수 없습니다. (0) | 2020.11.04 |
'자동'유형 추론 사용-컴파일러가 추론 한 유형을 찾는 방법은 무엇입니까? (0) | 2020.11.04 |