【发布时间】:2012-01-03 07:34:05
【问题描述】:
[我为这个无能的标题道歉;我想不出更好的办法。欢迎提出更好标题的建议。]
我想实现HDF5 文件的接口,通过文件锁定支持多进程级并发。该模块的预期环境是通过 NFS 访问共享磁盘的 Linux 集群。目标是允许在多个不同主机上运行的多个并行进程对同一文件进行并发访问(通过 NFS)。
我希望能够通过h5py.File 类的包装类来实现锁定功能。 (@987654322@ 已经提供了对线程级并发的支持,但是底层的 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 中实现这个效果?
谢谢!
【问题讨论】:
标签: python concurrency with-statement