Несколько пользователей Python присоединяются к одному и тому же файлу одновременно
Я работаю над сценарием Python, доступ к которому можно получить через Интернет, поэтому несколько пользователей будут пытаться добавить один и тот же файл одновременно. Меня беспокоит то, что это может вызвать состояние гонки, когда несколько пользователей одновременно писали в один и тот же файл, и это могло повредить файл.
Например:
#!/usr/bin/env python
g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close
Придется ли мне использовать для этого файл блокировки, так как эта операция выглядит рискованно.
4 ответа
Вы можете использовать блокировку файлов:
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)
Обратите внимание, что в некоторых системах блокировка не требуется, если вы пишете только небольшие буферы, потому что добавления в этих системах являются атомарными.
Если вы выполняете эту операцию в Linux, а размер кэша меньше 4 КБ, операция записи является атомарной, и вам следует подойти.
Больше читать здесь: Является ли файл append атомарным в UNIX?
Вы не указали, какую платформу вы используете, но вот модуль, который вы можете использовать, который является кроссплатформенным: Блокировка файлов в Python
В зависимости от местоположения вашей платформы / файловой системы это может быть неосуществимо безопасным способом (например, NFS). Возможно, вы сможете записывать в разные файлы и впоследствии объединять результаты?