Python Несколько пользователей одновременно присоединяются к одному файлу
Я работаю над python script, который будет доступен через Интернет, поэтому несколько пользователей будут пытаться присоединить к одному и тому же файлу одновременно. Мое беспокойство заключается в том, что это может привести к состоянию гонки, когда несколько пользователей одновременно записывают один файл, и это может привести к повреждению файла.
Например:
#!/usr/bin/env python
g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close
Должен ли я использовать файл блокировки для этого, поскольку эта операция выглядит рискованной.
Ответы
Ответ 1
Вы можете использовать блокировку файла:
import fcntl
new_entry = "foobar"
with open("/somepath/somefile.txt", "a") as g:
fcntl.flock(g, fcntl.LOCK_EX)
g.write(new_entry)
fcntl.flock(g, fcntl.LOCK_UN)
Обратите внимание, что для некоторых систем блокировка не необходима, если вы пишете только небольшие буферы, потому что добавляет в эти системы атомарные.
Ответ 2
Вы не указали, какую платформу используете, но вот модуль, который вы можете использовать, это кросс-платформа:
Блокировка файлов в Python
Ответ 3
В зависимости от местоположения вашей платформы/файловой системы это может быть невозможно выполнить безопасным образом (например, NFS). Возможно, вы можете писать в разные файлы и впоследствии объединять результаты?
Ответ 4
Если вы выполняете эту операцию в Linux, а размер кеша меньше 4 КБ, операция записи является атомарной, и вы должны быть хорошими.
Подробнее читайте здесь: Является ли файл append атомарным в UNIX?