Файл обновляется дважды при сбрасывании рассола - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть скрипт на python, который запускает различные другие скрипты, когда видит, что различные файлы были обновлены.Он быстро опрашивает файлы для проверки обновлений, просматривая даты изменения файлов.

В большинстве случаев это сработало так, как ожидалось.Когда один из моих сценариев обновляет файл, запускается другой сценарий и выполняются соответствующие действия.Для справки я использую соленья в качестве типа файла.

Однако, добавляя новый файл и соответствующий скрипт в микшер только сейчас, я заметил проблему, при которой дата изменения файла обновляется дважды.Один раз, когда я выполняю pickle.dump (), и снова, когда я выхожу из оператора «with» (когда файл закрывается).Это означает, что соответствующие действия запускаются дважды, а не один раз.Я думаю, это имеет смысл, но то, что сбивает с толку, это поведение не происходит ни с одним из моих других файлов.

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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Если консервирование достаточно велико (обычно где-то около 4+ КБ, хотя оно будет варьироваться в зависимости от ОС / файловой системы), такое поведение будет ожидаемым.Большая часть рассылки будет записана во время вызова dump как заполненные и записанные буферы, но независимо от того, какая дробь не использует, полный буфер файла будет оставлен в буфере до тех пор, пока файл не будет закрыт (что неявно сбрасывает все ожидающие буферизацию).данные до закрытия дескриптора).

Я согласен с другим ответом, что обычное решение заключается в том, чтобы записать файл в другую папку (но в той же файловой системе), а затем сразу после его закрытия использовать os.replace выполнить атомарное переименование, которое перемещает его из временного местоположения в конечное местоположение, чтобы не было разрыва между открытием файла, заполнением файла и закрытием файла;файл либо присутствует полностью, либо отсутствует вообще.

0 голосов
/ 22 ноября 2018

Я думаю, что вы наблюдаете 2 действия: файл создан и файл обновлен.Чтобы решить эту проблему, создайте и заполните файл за пределами отслеживаемых папок, и, как только блок «с» закончится (файл закрыт), переместите его из временного расположения в нужное место.

, чтобы сделать это, посмотрите на *Модуль 1003 * tempfile в стандартной библиотеке

...