我同时运行相同的Python程序作为不同的进程,这些进程都想使用h5py
Python包写入同一个hdf5
文件。但是,只有一个进程可以在写入模式下打开给定的hdf5
文件,否则您将收到错误
OSError:无法打开文件(无法锁定文件,errno = 11,错误 消息 ="资源暂时不可用")
在处理上述异常期间,发生了另一个异常:
OSError:无法创建文件(无法打开文件:名称 = 'test.hdf5', errno = 17, 错误消息 = '文件存在', 标志 = 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
...
我不确定我是否喜欢这个,因为它看起来不是很温柔。有没有更好的方法可以做到这一点?我错误地尝试打开try
内的文件是否会以某种方式损坏另一个进程中正在进行的写入过程?
通过快速研究判断,没有独立于平台的方法来检查文件是否已经是打开写入模式。 如何在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')来了解是否可以在写入模式下打开文件。
从本质上讲,它与您所做的事情没有太大不同。然而,首先,你可以查看你的fileytem,看看你的一个进程是否在写入模式下访问该文件,其次测试不是异常的产物,因为os.path.exist将返回一个布尔值。
许多应用程序使用这种技巧。在 CVS 存储库中漫游时,您经常会看到 .lock 文件躺在周围...