使用h5py以写入模式打开已打开的hdf5文件

jmd*_*_dk 6 python hdf5 multiprocessing file-writing h5py

我同时运行相同的Python程序作为不同的进程,所有这些都希望hdf5使用h5pyPython包写入同一文件。但是,只有一个进程可以hdf5以写入模式打开给定的文件,否则您将得到错误

OSError:无法打开文件(无法锁定文件,errno = 11,错误消息=“资源暂时不可用”)

在处理上述异常期间,发生了另一个异常:

OSError:无法创建文件(无法打开文件:name ='test.hdf5',errno = 17,错误消息='File exist',标志= 15,o_flags = c2)

我想通过检查文件是否已在写入模式下打开来解决此问题,如果是,请稍等一下,然后再次检查,直到不再在写入模式下打开文件为止。我没有发现h5py或的任何这种检查功能hdf5。到目前为止,我的解决方案基于以下内容:

from time import sleep
import h5py

# Function handling the intelligent hdf5 file opening
def open_hdf5(filename, *args, **kwargs):
    while True:
        try:
            hdf5_file = h5py.File(filename, *args, **kwargs)
            break  # Success!
        except OSError:
            sleep(5)  # Wait a bit
    return hdf5_file

# How to use the function
with open_hdf5(filename, mode='a') as hdf5_file:
    # Do stuff
    ...
Run Code Online (Sandbox Code Playgroud)

我不确定我是否喜欢这个,因为它看起来并不温柔。有什么更好的方法吗?我错误地尝试打开文件内的文件,是否try可能以某种方式破坏在另一个进程中进行的写入进程的任何变化?

Pil*_*ili 2

通过快速研究判断,没有独立于平台的方法来检查文件是否已经处于打开写入模式。 如何在 python 中检查文件是否 is_open 和 open_status https://bytes.com/topic/python/answers/612924-how-check-whether-file-open-not

然而,由于您已经定义了一种包装器打开读/写方法来读写您的 hdf5 文件,因此当您有一个进程成功打开 hdf5 文件时,您始终可以创建一个“file_name”.lock 文件

然后您所要做的就是使用 os.path.exists('"file_name".lock')来知道是否可以以写入模式打开文件。

从本质上讲,这对于你所做的事情来说并没有太大不同。然而,首先您可以查看文件系统以查看某个进程是否以写入模式访问文件,其次测试不是异常的结果,因为 os.path.exists 将返回布尔值。

许多应用程序都使用这种技巧。在 CVS 存储库中漫游时,您经常会看到 .lock 文件随处可见......