关于python:使用h5py打开已写入模式的hdf5文件

Opening already opened hdf5 file in write mode, using h5py

我同时运行同一个python程序作为不同的进程,这些进程都希望使用h5pypython包写入同一个hdf5文件。但是,只有一个进程可以在写入模式下打开给定的hdf5文件,否则会出现错误。

OSError: Unable to open file (unable to lock file, errno = 11, error
message = 'Resource temporarily unavailable')

During handling of the above exception, another exception occurred:

OSError: Unable to create file (unable to open file: name =
'test.hdf5', errno = 17, error message = 'File exists', flags = 15,
o_flags = c2)

我想通过检查文件是否已经在写模式下打开来解决这个问题,如果已经打开了,请稍等,然后再次检查,直到它不再在写模式下打开。我没有发现h5pyhdf5的这种检查能力。到目前为止,我的解决方案基于此:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
    ...

我不确定我是否喜欢这个,因为它看起来不太温和。有没有更好的办法?如果我错误地试图在try中打开文件,会以某种方式破坏另一个进程中正在进行的写入过程,是否有任何更改?


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

但是,由于您已经定义了一个包装打开读/写方法来读写您的HDF5文件,当您有一个成功打开HDF5文件的进程时,您总是可以创建一个"文件名".lock文件。

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

从本质上来说,这和你所做的没有什么不同。但是,首先,您可以查看文件系统以查看某个进程是否以写模式访问该文件;其次,测试不是异常的产物,因为os.path.exists将返回布尔值。

许多应用程序使用这种技巧。当漫游通过cvs repo时,您经常看到.lock文件在周围…