1

以下代码片段:

    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 具有打开文件的缓存机制......也许这可能是问题?

4

1 回答 1

2

供参考,请参阅熊猫文档

并发布 PyTables 3.1发行说明

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

您也可以尝试这样做:

with get_store('my_datafile.hdf',mode='r') as store:
    return store['my_series']

它会自动为你关闭它(我不认为这是线程安全的,但也许如果你把它放在你的with lock:里面它会是线程安全的。

如果您只是阅读,那么您根本不关心线程安全。在任何情况下都不要尝试写入多个线程(甚至进程)。这会炸毁你的文件。

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

import tables
tables.get_hdf_version()

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

于 2014-02-05T17:01:26.587 回答