2016-07-26 3 views
1

프로세스가 종료되면 파이썬에서 파일 객체는 어떻게됩니까? Python이 SIGTERM, SIGKILL, SIGHUP (등) 또는 KeyboardInterrupt 예외로 종료되는지 여부가 중요합니까?프로세스가 종료되면 파일 객체는 어떻게 파이썬에서 정리됩니까?

데이터를 지속적으로 수집하여 파일에 기록하는 일부 로깅 스크립트가 있습니다. 추가 정리 작업은 신경 쓰지 않지만 Python이 갑자기 종료되면 로그 파일이 손상되지 않도록하고 싶습니다 (예 : 백그라운드로 실행하고 컴퓨터를 종료 할 수 있음).

termtest.sh :

for i in $(seq 1 10); do 
    python termtest.py $i & export pypid=$! 
    sleep 0.3 
    echo $pypid 
    kill -SIGTERM $pypid 
done 

termtest.py : 나는 어떻게되는지하려고 다음 테스트 스크립트를 만들어

내가 SIGINT, SIGHUPSIGTERM을 변경 다른 신호 (과 termtest.sh를 실행
import csv 
import os 
import signal 
import sys 

end_loop = False 


def handle_interrupt(*args): 
    global end_loop 
    end_loop = True 


signal.signal(signal.SIGINT, handle_interrupt) 

with open('test' + str(sys.argv[-1]) + '.txt', 'w') as csvfile: 
    writer = csv.writer(csvfile) 
    for idx in range(int(1e7)): 
     writer.writerow((idx, 'a' * 60000)) 
     csvfile.flush() 
     os.fsync(csvfile.fileno()) 
     if end_loop: 
      break 

하고, SIGKILL in termtest.sh) (참고 :에 ​​대한 명시적인 처리기는 termtest.py입니다. 10 파이썬은 Ctrl+C이 아닌 것을 처리하지 않기 때문에). 모든 경우에 모든 출력 파일에는 전체 행 (부분 쓰기 없음) 만 있었으며 손상된 것으로 나타나지 않았습니다. 나는 flush()fsync()을 호출하여 데이터가 가능한 한 많이 디스크에 쓰여지고 있는지 확인하여 스크립트가 중간 쓰기가 중단 될 가능성이 가장 큽니다.

파이썬이 종료되고 중간 상태의 파일을 남기지 않을 때 항상 파이썬이 쓰기를 완료한다고 결론 지을 수 있습니까? 또는 이것은 운영 체제 및 파일 시스템 (Linux 및 ext4 파티션으로 테스트 중이 었습니다)에 따라 좌우됩니까?

답변

1

파일을 쓰는 방법만큼 파일을 "정리"하지 않습니다. 프로그램이 하나의 "청크"데이터 (행 또는 기타)에 대해 여러 번 쓰기를 수행 할 수 있으며이 과정의 중간에 중단되어 부분 기록으로 작성 될 수 있습니다.

csv 모듈의 경우 C source을 보면 각 행을 문자열 버퍼로 어셈블 한 다음 write()이라는 단일 호출을 사용하여 코드를 씁니다. 그것은 일반적으로 안전해야합니다. 행이 운영 체제로 전달되거나 그렇지 않은 경우, 운영 체제에 도착하면 모든 것이 기록되거나 그렇지 않습니다 (물론 하드웨어 부분과 같은 부분은 불량 섹터에 들어갈 수 있습니다).

writer 객체는 Python 객체이며 사용자 정의 작성기는이 문제를 해결할 수있는 write()에서 이상한 작업을 수행 할 수 있지만 일반 파일 객체라고 가정하면 정상적으로 처리됩니다.