Как мне поделиться словарем блокировок в многопроцессорной обработке

#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 .