구성 파일과 상호 작용하는 라이브러리가 있습니다. 라이브러리를 가져 오면 초기화 코드가 구성 파일을 읽고 가능하면 업데이트 한 다음 변경된 내용이없는 경우에도 파일에 업데이트 된 내용을 다시 씁니다.파이썬은 언제 파일을 디스크에 씁니까?
매우 가끔 구성 파일의 내용이 사라지는 문제가 발생합니다. 특히 이것은 짧은 스크립트 (라이브러리를 사용하여)를 여러 번 호출하여 수천 번 연속 실행할 때 발생합니다. 그것은 동일한 디렉토리에서 결코 발생하지 않으며, 이것은 다소 임의적 인 문제, 특히 IO를 가진 경쟁 조건이라고 믿게합니다.
이 문제는 안정적으로 문제를 재현 할 수 없으며 일부 시스템에서만 발생하기 때문에 디버깅하는 데 어려움이 있습니다. 필자는 무슨 일이 일어날 지 의심 스럽지만 파이썬에서 파일 I/O에 대한 내 그림이 올바른지 알고 싶다.
질문 : 파이썬 프로그램이 실제로 파일 내용을 디스크에 기록하는시기는 언제입니까? 파일이 닫힌 시간까지 내용이 디스크에 저장 될 것이라고 생각했지만이 오류를 설명 할 수는 없습니다. 파이썬이 파일을 닫을 때, 내용을 디스크 자체로 플러시하거나 파일 시스템에 큐에 넣을 수 있습니까? 파이썬이 종료 된 후 파일 내용을 디스크에 쓸 수 있습니까?fp.flush(); os.fsync(fp.fileno())
(fp
은 파일 핸들)을 사용하여이 문제를 방지 할 수 있습니까?
문제가 생기면 유닉스 시스템 (특히 Mac OS X)에서 프로그래밍하고 있습니다. 편집 : 또한 프로세스가 동시에 실행되고 있지 않습니다.
부록 :
- 이 프로세스 # 1를 호출 : 여기에 내가 생각하는 특정 경쟁 조건입니다.
- 프로세스 # 1은 구성 파일을 읽기 모드로 열고 완료되면 닫습니다.
- 프로세스 # 1은 구성 파일을 쓰기 모드로 열고 모든 내용을 지 웁니다. 내용 지우기가 디스크에 동기화됩니다.
- 프로세스 # 1은 새 내용을 파일 핸들에 쓰고 닫습니다.
- 프로세스 # 1 : 파일을 닫으면 Python이 OS에이 내용을 디스크에 대기열에 기록하도록 지시합니다.
- 프로세스 # 1 닫히고
- 프로세스 # 2를 종료는
- 프로세스 # 2 읽기 모드로 구성 파일을 엽니 다 호출하지만, 새로운 내용이 아직 동기화되지 않습니다. 프로세스 # 2는 빈 파일을 봅니다.
- 프로세스 2가 파일을 읽은 후 OS가 마침내 디스크에 내용 쓰기를 완료했습니다.
- 프로세스 2는 파일이 비어 있다고 생각하고 구성 파일의 기본값을 설정합니다.
- 프로세스 # 2는 구성 파일의 버전을 디스크에 쓰고 마지막 버전을 덮어 씁니다.
아니요, 아니요, 파이썬이 파일을 닫으면 파일이 디스크로 플러시되었습니다. 나는 당신이 생각하는 것보다 프로세스 # 2가 파일을 일찍 열 것이라고 말하고 싶다. –
여러 프로세스가 동시에 파일에 액세스하고 이들 중 하나 이상이 파일에 쓰는 경우 일관된 결과를 얻기 위해 프로세스를 동기화해야합니다. 파이썬에만 국한된 것은 아닙니다. –
OS가 데이터를 디스크에 쓰지 않더라도 파일에 액세스하는 모든 사람이 공유하는 메모리 캐시가 있기 때문에 파이썬에서 플러시되는 한 파일의 내용을 2. 프로세스로 반환합니다. . (일관성을 위해 구성되지 않은 공유 파일 시스템의 다른 컴퓨터에서 프로세스를 실행하거나 파일을 덮어 쓰는 경쟁 조건이없는 경우) – nos