#python #python-3.x #locking #multiprocessing
#python #python-3.x #блокировка #многопроцессорная обработка
Вопрос:
Я использую многопроцессорную обработку python и пытаюсь предотвратить одновременное обновление нескольких ресурсов (например, файлов), каждый из которых идентифицируется по имени. Я не знаю всех имен заранее. Поэтому я пытаюсь использовать
class A:
resource_locks_lock = RLock()
resource_locks = {} # type: Dict[str, RLock]
def some_method(self, name: str) -> None
with A.resource_locks_lock:
if name not in A.resource_locks.keys():
A.resource_locks[name] = RLock()
A.resource_locks[name].acquire()
[...]
A.resource_locks[name].release()
Однако это не мешает нескольким экземплярам этого класса в отдельных процессах (с использованием многопроцессорной обработки python) одновременно обращаться к заблокированному ресурсу. Кажется, что каждый процесс получает свою собственную версию словаря и блокировок.
Что мне нужно сделать, чтобы предотвратить одновременный доступ через границы многопроцессорной обработки python?
Комментарии:
1. Взгляните на многопроцессорную
Manager.dict()
обработку . Это позволяет нескольким процессам совместно использовать один объект словаря. Этого может быть достаточно для того, что вам нужно.2. Вы можете заблокировать сами файлы. Существуют зависимости операционной системы и другие проблемы. Я использовал
lockfile
его раньше, но я заметил, что в его документах pypi говорится, что он устарел в пользу pypi.python.org/pypi/fasteners .