2010-03-23 2 views
2

예제 코드의 조각이있다 : 첫 번째 읽기는 시스템 파일 기술자를 할당 할 그것을 모습에, 그 내용을 읽어 파이썬 기간은 <a href="http://docs.python.org/library/pickle.html" rel="nofollow noreferrer">pickle module documentation</a>에서

reader = pickle.load(open('save.p', 'rb')) 

다음 close()을 호출 할 수있는 핸들이 없기 때문에 열린 디스크립터를 "누설"합니다. 이것은이 사건을 처리하는 숨겨진 마술이 있는지 궁금해했습니다.

소스로 다이빙하면서 Modules/_fileio.c에서 fileio_dealloc() 소멸자가 파일 설명자를 닫았으며 실제 질문을 이끌어 냈습니다.

위의 예제 코드에서 사용되는 파일 객체의 지속 시간은 얼마입니까? 그 명령문이 실행 된 후에 그 객체는 참으로 참조 해제되지 않으므로 fd는 미래의 가비지 콜렉션 스윕에서 실제 close(2) 호출을 받게 될 것입니까? 그렇다면, 예제 라인은 좋은 연습일까요? 아니면 커널이 프로세스 디스크립터 테이블이 고갈 될 위험이있는 fd에 의존하지 않아야합니까?

답변

3

위의 예제 코드 에 의해 반환 된 파일의 기간은 얼마입니까?

그 코드 (질문의 제목이 제대로 말한대로, 그것은 인수로 수신)하지 반환 파일 객체를한다.

현재 CPython에서는 함수가 반환 할 때 파일이 닫힙니다 (함수가 파일 객체에 대한 참조를 더 내구성있는 장소에 숨기지 않으므로). 다른 구현에서는 파일이 "결국"닫히지 만 정확한 시간은 지정되지 않습니다.

CPython의 즉각적인 클로저 의미 (이후의 CPython이 더 나은 가비지 수집 메커니즘으로 이동할 때 변경 될 수 있음)에 따라 매우 전통적인 접근 방식이지만 모범 사례는 아닙니다. 로, 파일의 즉각적인 폐쇄가 (즉시 with 문의 몸이 끝나는대로) 모든 구현에 보장이 사용을

with open(...) as f: 
    reader = pickle.load(f) 

:

오히려 가장 좋은 방법은 with 문을 사용하는 것입니다.

파이썬 2.5에서는 with을 사용하려면 from __future__ import with_statement이 필요합니다. 2.6 이상에서는 이러한 "미래로부터의 임포트"가이 목적을 위해 필요하지 않습니다 (무해한 것입니다. 그러나 2.5 이하에서는 실행되지 않을 것이라는 것을 알고 있다면 그것은 중복되고 더 잘 제거됩니다).

+0

감사합니다. 당신이 옳았어요. "돌아왔다"가 아니라 "사용하다"를 의미하고 수정하기 위해 편집했습니다. – msw