[Я прошу прощения за неумелый заголовок; Я не мог придумать ничего лучшего. Приветствуются предложения по улучшению названия.]
Я хочу реализовать интерфейс к HDF5 файлам, который поддерживает параллелизм на уровне нескольких процессов посредством блокировки файлов. Средой, предназначенной для этого модуля, является кластер Linux с доступом к общему диску через NFS. Цель состоит в том, чтобы включить параллельный доступ (через NFS) к одному и тому же файлу несколькими параллельными процессами, запущенными на нескольких разных хостах.
Я хотел бы иметь возможность реализовать функцию блокировки через класс-оболочку для класса h5py.File
. (<a href="http://code.google.com/p/h5py/" rel="noreferrer">h5py</a>
уже предлагает поддержку thread -уровня параллелизма, но базовая библиотека 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?
Спасибо!