Открытый файл Python в общем режиме

Я видел несколько вопросов, связанных с этим, но ничего, что окончательно ответило бы на мой вопрос.

У меня есть короткий скрипт на Python, который выполняет несколько простых задач, затем выводит некоторый текст в файл журнала, ждет дополнительных входных данных и зацикливается.

Иногда файл открывается в режиме записи («w»), а иногда — в режиме добавления («a») в зависимости от результатов других задач. Для простоты предположим, что он находится в режиме записи/добавления 50/50.

Я открываю файлы, говоря:

with open(fileName, mode) as file:

и написав им, сказав:

file.write(line)

Пока эти файлы открываются, записываются, добавляются и т. Д., Я ожидаю, что командная строка будет выполнять некоторые действия по чтению с ними (в частности, findstr).

1) Что произойдет, если мой скрипт попытается записать в тот же файл, из которого считывается командное окно?

2) Есть ли способ явно установить открытый в общий режим?

3) Помогает ли использование модуля «логгер» вообще / справляется с этим вместо того, чтобы просто вручную создавать свои собственные файлы журналов?

Спасибо


person Mike T    schedule 17.11.2014    source источник


Ответы (1)


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

Вот интересная статья о том, как избежать состояния гонки в python: http://blog.gocept.com/2013/07/15/reliable-file-updates-with-python/

Одно из предложений, которое делает автор, состоит в том, чтобы скопировать файл во временный файл, сделать туда записи/добавления, а затем переместить файл обратно. Условия гонки возникают, когда файлы остаются открытыми в течение длительного времени, таким образом, вы фактически никогда не открываете основной файл в python, поэтому единственная точка, в которой может произойти столкновение, - это операции копирования/перемещения ОС, которые намного быстрее.

person Mike Ounsworth    schedule 17.11.2014
comment
После еще немного исследований и экспериментов я могу с осторожностью подтвердить, что python позволит окну команд читать из файла, который в данный момент открыт для записи/добавления. Не могу говорить о других процессах - person Mike T; 18.11.2014
comment
Прохладный! Если один процесс выполняет только чтение, то это, вероятно, в любом случае безопасно. Проблемы возникают, когда две или более вещей пытаются писать одновременно. - person Mike Ounsworth; 18.11.2014
comment
3000 просмотров и 5 лет опыта спустя, я надеюсь, что люди, которые приходят сюда, пробуют ваш подход к временным файлам, который определенно безопаснее, чем то, что я прокомментировал выше. - person Mike T; 30.10.2019