Как дать классу функциональность, подобную выражению with?

[Прошу прощения за неумелое название; Ничего лучшего я придумать не мог. Приветствуются предложения по лучшему названию.]

Я хочу реализовать интерфейс для файлов 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') предоставляют открытый дескриптор клиентскому коду, который затем может выполнять над ним различные произвольные операции чтения / записи. Когда этот дескриптор выходит за пределы области видимости, его деструктор закрывает дескриптор, тем самым освобождая блокировку.

Цель, которая мотивирует эту схему, является двоякой:

  1. отделить создание дескриптора (кодом библиотеки) от операций, которые впоследствии запрашиваются на дескрипторе (клиентским кодом), и

  2. гарантируют, что дескриптор закрыт и блокировка снята, независимо от того, что происходит во время выполнения промежуточного кода (например, исключения, необработанные сигналы, внутренние ошибки Python).

Как я могу добиться этого эффекта в Python?

Спасибо!

5
задан kjo 21 November 2011 в 20:15
поделиться