前提:
我创建了一个主窗口。其中一个下拉菜单中有一个' 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的解决方案感兴趣。
答案 0 :(得分:3)
这是一个非常复杂的问题需要解决,而且这种格式并不适合为所有问题提供完整的答案。但是,我会尝试让你走上正确的轨道。
如何使此流程无阻塞,以便UI仍然具有响应能力?我仍然希望我的处理功能能够更新QProgressDialog及其相关标签。
要使其成为非阻塞,您需要将处理卸载到Python线程或QThread
。更好的是,将它卸载到一个子进程中,通过主程序中的一个线程将进程传回主程序。
我将让您实施(或提出另一个问题)创建子流程或线程。但是,您需要注意只有MainThread才能访问GUI方法。这意味着如果使用QThread
或使用python线程中的QApplication.postEvent()
,您需要发出信号(我已将后者包装到Python 2.7 here的库中。 3兼容性将来一天)
我可以将其扩展为同时处理多个数据集并保留更新进度条信息的功能吗?
是。一个例子是产生许多子过程。每个子进程可以被配置为将消息发送回主进程中的关联线程,该主进程通过针对上述点描述的方法将进度信息传送到GUI。您如何显示此进度信息取决于您。
我可以从多个线程/进程/等中写入h5py吗?我是否必须在写操作上实现锁定?
您不应该一次从多个线程写入hdf5文件。您需要实现锁定。我想甚至可能连读读取都应序列化。