python - 如何为类提供类似 with-statement 的功能?

标签 python concurrency with-statement

[我为这个无能的标题道歉;我想不出更好的办法。欢迎提出更好的标题建议。]

我想实现 HDF5 的接口(interface)通过文件锁定支持多进程级并发的文件。本模块的预期环境是通过 NFS 访问共享磁盘的 Linux 集群。目标是通过在多个不同主机上运行的多个并行进程启用对同一文件的并发访问(通过 NFS)。

我希望能够通过 h5py.File 的包装类实现锁定功能类(class)。 (<a href="http://code.google.com/p/h5py/" rel="noreferrer noopener nofollow">h5py</a> 已经提供对线程级并发的支持,但底层 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. 确保 handle 关闭并释放锁,无论在此过程中发生什么 执行中间代码(例如异常、未处理的 信号、Python 内部错误)。

如何在 Python 中实现这种效果?

谢谢!

最佳答案

可以在with 语句中使用的对象称为上下文管理器;他们实现了一个简单的接口(interface)。它们必须提供两种方法,一种是 __enter__ 方法,它不带任何参数并且可以返回任何内容(将被分配给 as 部分中的变量),另一种是 __exit__ 方法,它接受三个参数(将用 sys.exc_info() 的结果填充)并返回非零值以指示已处理异常。您的示例可能如下所示:

class LockedH5File(object):
    def __init__(self, path, ...):
        self.path = path

    def __enter__(self):
        self.h5handle = h5handle = h5py.File(self.path, 'r+')
        fcntl.flock(fcntl.LOCK_EX)
        return h5handle

    def __exit__(self, exc_type, exc_info, exc_tb):
        self.h5handle.close()

关于python - 如何为类提供类似 with-statement 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8217968/

相关文章:

python - 当cursor.fetchall()时出现UnicodeDecodeError

python - 如何从生成的 Django 表单中删除文本?

python - 在 python 中组合 'with' 和 'yield' 是否安全?

javascript - 拦截属性查找/检查的方法?

java - 限制对字段的并发访问

vba - 当工作表更改时,变量未存储在代码中

python - 让两个输入之间的欧几里德距离在一个循环内填充一个矩阵

php - 检查域名是否被注册

c# - 最简单的并发模式

.net - 在 .NET 并发线程之间传递数据的最佳方法是什么?