如何从磁盘加载,处理,然后将数据与 python、pyqt、h5py 同时存储在一个通用的 hdf5 中?

tro*_*rau 5 python multithreading numpy pyqt h5py

前提:

我已经创建了一个主窗口。下拉菜单之一有一个“ProcessData”项。当它被选中时,我创建了一个 QProgressDialog。然后我在主循环中做很多处理并定期更新 QProgressDialog 中的标签和百分比。

我的处理看起来像:从文件(numpy memmapped array)中读取大量数据,做一些信号处理,将输出写入一个普通的 h5py 文件。我遍历可用的输入文件,并将所有输出存储在一个通用的 h5py hdf5 文件中。每个输入文件的整个过程大约需要两分钟,并将一个 CPU 固定到 100%。

目标:

我如何使这个过程无阻塞,以便 UI 仍然响应?我仍然希望我的处理函数能够更新 QProgressDialog 及其相关标签。

我可以扩展它以同时处理多个数据集并保留更新进度条信息的能力吗?

我可以从多个线程/进程/等写入 h5py 吗?我是否必须对写操作实施锁定?

软件版本:

我使用 python 3.3+ 和 numpy/scipy/etc。UI 在 PyQt4 4.11/Qt 4.8 中,尽管我对使用 python 3.4(因此是 asyncio)或 PyQt5 的解决方案感兴趣。

thr*_*les 4

这是一个需要解决的相当复杂的问题,这种格式并不适合为您的所有问题提供完整的答案。不过,我会尽力让你走上正轨。

如何使该过程非阻塞,以便 UI 仍然响应?我仍然希望我的处理函数能够更新 QProgressDialog 及其关联的标签。

为了使其非阻塞,您需要将处理卸载到 Python 线程或QThread. 更好的是,将其卸载到子进程中,该子进程通过主程序中的线程将进度传回主程序。

我将让您实现(或提出另一个问题)创建子进程或线程。但是,您需要注意,只有 MainThread 可以访问 GUI 方法。QThread这意味着如果使用 python 线程或使用python 线程,则需要发出信号QApplication.postEvent()(我已将后者包装到 Python 2.7 的库中。一天,Python 3 兼容性将会出现)

我可以扩展它以同时处理多个数据集并保留更新进度条信息的能力吗?

是的。一个例子是产生许多子流程。每个子进程都可以配置为将消息发送回主进程中的关联线程,主进程通过上述方法将进度信息传递给 GUI。如何显示此进度信息取决于您。

我可以从多个线程/进程/等写入 h5py 吗?我必须对写操作实施锁定吗?

您不应一次从多个线程写入 hdf5 文件。您将需要实施锁定。我认为甚至可能读取访问也应该序列化。

我的一位同事已经为 Python 2.7 制作了一些类似的东西(请参阅此处此处),欢迎您查看它,或者如果您愿意的话,可以派生它。