문제

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

~해야 한다 urllib.urlopen() 따라야합니다 urllib.close()? 그렇지 않으면 연결이 누출됩니까?

도움이 되었습니까?

해결책

그만큼 close 방법을 호출해야합니다 결과urllib.urlopen, ~ 아니다urllib 생각대로 모듈 자체 (언급 한대로 urllib.close - 존재하지 않음).

최선의 접근 방식 : 대신 x = urllib.urlopen(u) 기타, 사용 :

import contextlib

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

그만큼 with 진술, 그리고 closing 컨텍스트 관리자는 예외가있는 경우에도 적절한 폐쇄를 보장합니다.

다른 팁

@Peter와 마찬가지로 Scope 외부 URL은 쓰레기 수집을받을 수 있습니다.

그러나 또한 주목하십시오 urllib.py 정의 :

 def __del__(self):
        self.close()

이것은 그것을 의미합니다 해당 인스턴스의 참조 수가 0에 도달하면, 그것의 __del__ 메소드가 호출되어 그에 따라 호출됩니다 close 방법도 호출됩니다. 참조 수가 0에 도달하는 가장 "정상적인"방법은 인스턴스를 단순히 범위를 벗어나게하는 것입니다. del x 일찍 (그러나 직접 전화하지 않습니다 __del__ 그러나 참조 수를 하나만 줄입니다).

자원을 명시 적으로 닫는 것은 확실히 좋은 스타일입니다. 특히 응용 프로그램이 너무 많은 자원을 사용할 위험이 있지만 파이썬 ~ 할 것이다 더 이상 필요하지 않은 인스턴스에 대한 참조와 같은 재미있는 일을하지 않으면 자동으로 정리하십시오.

엄밀히 말하면, 이것은 사실입니다. 그러나 실제로 한 번 (if) urllib 범위를 벗어나면 자동 쓰레기 수집기가 연결을 닫습니다.

당신은 기본적으로 하다 사용할 때는 연결을 명시 적으로 닫아야합니다 Ironpython. 범위를 벗어나는 자동 폐쇄는 쓰레기 수집에 의존합니다. 나는 쓰레기 수집이 오랫동안 실행되지 않은 상황에 부딪쳐서 창문이 소켓이 부족했습니다. 나는 고주파에서 웹 서버를 폴링하고 있었다 (즉, Ironpython만큼 높고 연결이 허용 할 수있는 ~ 7Hz). Perfmon에서 "확립 된 연결"(즉, 사용중인 소켓)이 올라가는 것을 볼 수있었습니다. 해결책은 전화하는 것이 었습니다 gc.collect() 모든 전화 후 urlopen.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top