Присоединение к концу файла в параллельной среде - PullRequest
3 голосов
/ 27 сентября 2011

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

#!/usr/bin/env python
import random
passwd_text=open("passwd.txt","a+")
u=("jsmith:x:1001:1000:Joe Smith,Room 1007,(234)555-8917,(234)555-0077,jsmith@rosettacode.org:/home/jsmith:/bin/sh",
  "jdoe:x:1002:1000:Jane Doe,Room 1004,(234)555-8914,(234)555-0044,jdoe@rosettacode.org:/home/jdoe:/bin/sh",
  "xyz:x:1003:1000:X Yz,Room 1003,(234)555-8913,(234)555-0033,xyz@rosettacode.org:/home/xyz:/bin/sh")
for i in range(random.randint(1,2)):
  print >> passwd_text, random.choice(u)
passwd_text.close()

И: Можно ли гарантировать добавление "все или ничего" (в linux / unix), даже если диск заполнен или установлен "ulimit -f"?

(Обратите внимание на аналогичный вопрос: Как добавить файл? )

Ответы [ 2 ]

7 голосов
/ 05 ноября 2012

Я думаю, что обсуждение этой "ошибки" в нормальной функции open Python предполагает, что вы не получаете атомную гарантию POSIX, но вы получаете, если используете

with io.open('myfile', 'a') as f:
    f.write('stuff')

http://docs.python.org/2/library/io.html#io.open

, если операционная система правильно выполняет системный вызов write ...

http://bugs.python.org/issue15723

3 голосов
/ 27 сентября 2011

Вы должны заблокировать файл, чтобы никто другой не записывал в него одновременно. См. File Locking и lockfile или posixfile для получения дополнительной информации.

ОБНОВЛЕНИЕ: И вы не можете записать больше данных в файл, если диск заполнен. Я не уверен насчет реализации перенаправления вывода в Python, но системный вызов write может записать меньше байтов, чем запрошено.

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