Python 使用HDFStore文件的线程和异常安全方式

Python 使用HDFStore文件的线程和异常安全方式,python,multithreading,pandas,pytables,hdfstore,Python,Multithreading,Pandas,Pytables,Hdfstore,以下代码段: HDFStore = pandas.io.pytables.HDFStore lock = threading.RLock() with lock: store = HDFStore('my_datafile.hdf','r') data_frame = store['my_series'] store.close() return data_frame['my_column'] 是响应web请求执行

以下代码段:

    HDFStore = pandas.io.pytables.HDFStore
    lock = threading.RLock()
    with lock:
        store = HDFStore('my_datafile.hdf','r')
        data_frame = store['my_series']
        store.close()
    return data_frame['my_column']
是响应web请求执行的,因此它可能同时在多个线程上执行。也可能在调用store.close之前中断执行

我遇到了一些不可复制的问题(HDFStore库中的异常,或返回的空数据)

什么是确保此代码线程安全的正确方法,并确保在出现异常时正确关闭文件


通过一些调查,我发现HDFStore对打开的文件有一个缓存机制。。。也许这就是问题所在?

有关参考信息,请参阅熊猫

只需发布PyTables 3.1

这应该适用于PyTables 3.0.0。只要您没有在任何其他地方写入文件(如果文件已经存在)

您也可以尝试这样做:

with get_store('my_datafile.hdf',mode='r') as store:
    return store['my_series']
这将自动为您关闭它(我不认为这是线程安全的,但是如果您将它放在带锁的
中:
它将是线程安全的

如果您只进行读取,那么您根本不关心线程安全。在任何情况下都不要尝试在多个线程(甚至进程)中写入。这会导致文件崩溃

PyTables 3.1刚刚发布,至少在较低的HDF5版本上更改了文件缓存机制,要查看您的版本,请执行以下操作:

import tables
tables.get_hdf_version()

我不知道这会对线程安全性产生什么影响。

我想我有pytables版本2.3.1(“模块”对象没有“get\u hdf\u version”属性)。在3.1发行说明中,它说:“PyTables不再使用共享/缓存文件处理程序。此更改在一定程度上改进了对并发读取的支持,允许用户在不同线程中安全地打开同一文件进行读取”因此,并发读取可能也存在严重问题。非常感谢您指出并发写入的风险(即使在我的情况下不太可能,也会造成破坏!)您认为写入临时文件然后将临时文件(mv)移动到目标文件安全吗?还是最好使用锁(线程和/或进程)?并发读取在多线程/进程中可以正常工作。3.1中的更改更多地是将Pytable与底层HDF5协议的工作方式对齐。也就是说,在<3.0.0中可能存在错误。您可以从单个进程/线程写入单个唯一的文件,没有问题。只是不要尝试写入同一个文件,即使是不同的节点具有多个进程/线程。