Несколько пользователей 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). Возможно, вы сможете записывать в разные файлы и впоследствии объединять результаты?

Другие вопросы по тегам