Подтвердить что ты не робот

Python Несколько пользователей одновременно присоединяются к одному файлу

Я работаю над python script, который будет доступен через Интернет, поэтому несколько пользователей будут пытаться присоединить к одному и тому же файлу одновременно. Мое беспокойство заключается в том, что это может привести к состоянию гонки, когда несколько пользователей одновременно записывают один файл, и это может привести к повреждению файла.

Например:

#!/usr/bin/env python

g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close

Должен ли я использовать файл блокировки для этого, поскольку эта операция выглядит рискованной.

4b9b3361

Ответ 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?