Что произойдет, если я внезапно закрою свой скрипт, пока он все еще выполняет операции ввода-вывода файла? - PullRequest
3 голосов
/ 06 января 2011

вот мой вопрос: я пишу скрипт, чтобы проверить, нормально ли работает мой сайт, основная идея - получать время отклика сервера и подобные вещи каждые 5 минут или около того, и скрипт будет регистрировать информацию каждый раз после проверки состояния сервера. Я знаю, что нет смысла закрывать скрипт, пока он находится в процессе проверки / записи журналов, но мне любопытно, если есть много серверов для проверки, а также вам нужно довольно часто выполнять файловый ввод-вывод, что произойдет если вы резко закроете скрипт?

ОК, вот пример:

while True:
    DemoFile = open("DemoFile.txt", "a")
    DemoFile.write("This is a test!")
    DemoFile.close()

    time.sleep(30)

Если я случайно закрою скрипт во время работы этой строки DemoFile.write("This is a test!"), что я получу в DemoFile.txt? Я получу «Это я» (неполная строка) или полную строку или даже не добавленную строку?

Надеюсь, кто-нибудь знает ответ.

1 Ответ

2 голосов
/ 06 января 2011

Согласно документации python io , буферизация обрабатывается в соответствии с параметром буферизации функции open.

Поведение по умолчанию в этом случае будет либо размером блока устройства, либо io.DEFAULT_BUFFER_SIZE, если размер блока определить невозможно. Это, вероятно, что-то вроде 4096 байт.

Короче говоря, этот пример ничего не напишет. Если бы вы писали что-то достаточно длинное, чтобы буфер был записан один или два раза, у вас было бы кратно написанному размеру буфера. И вы всегда можете вручную очистить буфер с помощью flush ().

(Если вы укажете буферизацию как 0, а режим файла как двоичный, вы получите «This i». Это единственный способ)

Как указал @sven, python не выполняет буферизацию. После завершения программы все дескрипторы открытых файлов закрываются и очищаются операционной системой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...