Что является хорошей стратегией генерировать и скопировать файлы атомарно

Предположим, что вход находится в input.txt, и Вы хотите вывод в output.txt. Сделайте сценарий Python и назовите его sort.py как это:

l=map(int,raw_input("").strip().split())
l.sort() 
print l  # It will store it as a list

# or more precisely your answer can be
k=""
for i in l:
    k+=str(i)+" "
print k       #same output as you want

Выполните его в терминале:

python sort.py < input.txt > output.txt
6
04.09.2014, 23:57
2 ответа

Если вы перемещаете внутри одной и той же файловой системы, mv является атомарным -- это просто переименование, а не копирование содержимого. Так что если на последнем шаге вашего поколения:

mv myfile.new myfile.last

Процессы чтения всегда будут видеть либо старую, либо новую версию файла, никогда ничего неполного.

5
27.01.2020, 20:27

Вы можете упростить ваше первое предложенное решение: восстановить файл в myfile.new, затем переименовать (mv) его в myfile.

Если вы перезаписывали myfile с новыми данными, то асинхронный читатель могут получить поврежденные (или, по крайней мере, неполные) данные - но вы это уже знаете.  Я уверен, что любое из предложенных вами решений будет безопасным.  Если другой процесс откроет версию файла в 12:34 в 12:38, тогда он будет продолжать иметь этот файл открытым для чтения. после того, как вы переименовали версию файла 12:39 в my file, несмотря на то, что он больше не появляется ни в одном каталоге.  Во втором случае это еще более понятно, где версия 12:34 остается в каталоге. после изменения символической ссылки на указатель на файл 12:39.

2
27.01.2020, 20:27

Теги

Похожие вопросы