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可能以某种方式破坏在另一个进程中进行的写入进程的任何变化?
通过快速研究判断,没有独立于平台的方法来检查文件是否已经处于打开写入模式。 如何在 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 文件随处可见......
| 归档时间: |
|
| 查看次数: |
3942 次 |
| 最近记录: |