[Прошу прощения за неумелое название; Ничего лучшего я придумать не мог. Приветствуются предложения по лучшему названию.]
Я хочу реализовать интерфейс для файлов HDF5 , который поддерживает многопроцессорный параллелизм посредством блокировки файлов. Предполагаемая среда для этого модуля - кластер Linux, имеющий доступ к общему диску через NFS. Цель состоит в том, чтобы разрешить одновременный доступ (через NFS) к одному и тому же файлу для нескольких параллельных процессов, запущенных на нескольких разных хостах.
Я хотел бы иметь возможность реализовать функцию блокировки с помощью класса-оболочки для класса h5py.File
. ( h5py
уже предлагает поддержку параллелизма на уровне потоков , но лежащая в основе библиотека HDF5 не является потокобезопасной.)
Было бы здорово, если бы я мог что-то сделать в духе этого:
class LockedH5File(object):
def __init__(self, path, ...):
...
with h5py.File(path, 'r+') as h5handle:
fcntl.flock(fcntl.LOCK_EX)
yield h5handle
# (method returns)
Я понимаю, что приведенный выше код неверен, но я надеюсь, что он передает основную идею: а именно, иметь выражение LockedH5File ('/ path / to / file')
предоставляют открытый дескриптор клиентскому коду, который затем может выполнять над ним различные произвольные операции чтения / записи. Когда этот дескриптор выходит за пределы области видимости, его деструктор закрывает дескриптор, тем самым освобождая блокировку.
Цель, которая мотивирует эту схему, является двоякой:
отделить создание дескриптора (кодом библиотеки) от операций, которые впоследствии запрашиваются на дескрипторе (клиентским кодом), и
гарантируют, что дескриптор закрыт и блокировка снята, независимо от того, что происходит во время выполнения промежуточного кода (например, исключения, необработанные сигналы, внутренние ошибки Python).
Как я могу добиться этого эффекта в Python?
Спасибо!