使用h5py

时间:2018-03-22 21:30:36

标签: python multiprocessing hdf5 h5py file-writing

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

  

OSError:无法打开文件(无法锁定文件,错误= 11,错误   message ='资源暂时不可用')

     

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

     

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

我想通过检查文件是否已在写入模式下打开来解决此问题,如果是,请稍等一会再检查,直到它在写入模式下不再打开。我没有找到h5pyhdf5的任何此类检查功能。截至目前,我的解决方案基于:

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内打开文件的错误尝试是否会以某种方式破坏其他进程中正在进行的写入过程,是否有任何更改?

1 个答案:

答案 0 :(得分:2)

通过快速研究判断,没有平台独立的方法来检查文件是否已处于开放写入模式。 How to check whether a file is_open and the open_status in python 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文件在周围...