Многопроцессная условная / именованная блокировка - PullRequest
1 голос
/ 09 сентября 2010

В многопроцессорной программе я хочу заблокировать определенную функцию на основе аргументов, например,

def calculate(spreadsheet):
    _do_calc(spreadsheet)

Теперь то, что я хочу сделать, основано на электронной таблице, заблокируйте функцию, чтобы несколько таблиц могли работать одновременно, нодва вызова в одной электронной таблице будут заблокированы, например,

def calculate(spreadsheet):
    with Lock(spreadsheet.id):
      _do_calc(spreadsheet)

Возможно ли это с помощью многопроцессорной обработки. Блокировка, если нет, каковы альтернативы?Я имею в виду использование блокировки файлов на основе fcntl.

Редактировать : Выше была очень упрощенная версия моей проблемы, в основном я не использую многопроцессорный модуль, у меня N различных скриптов, которыеработать с некоторыми данными, а иногда и с теми же данными, которых я хотел избежать, поэтому хотел каким-то образом синхронизировать их в некоторых точках, например, все они могут импортировать модуль mylock и использовать mylock.lock для синхронизации

import mylock

def calculate(spreadsheet):
    with mylock.lock(spreadsheet.id):
      _do_calc(spreadsheet)

Чтоя могу написать mylock.lock различными способами, в настоящее время я просто создаю файл с именем spreadsheet.id и удаляю его при снятии блокировки.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2010

Возможно, вы сможете улучшить простое открытие файла с помощью этого рецепта , который я тестировал на Linux и Windows.

2 голосов
/ 09 сентября 2010

Почему бы не присвоить каждой электронной таблице Lock в качестве атрибута экземпляра?

class Spreadsheet(...):
    def __init__(self, ...):
        self.lock = multiprocessing.Lock()

    ...

, а затем

def calculate(spreadsheet):
    with spreadsheet.lock:
        ...
...