前提:
我创建了一个主窗口.下拉菜单之一具有“ ProcessData”项.选择它后,我将创建一个QProgressDialog.然后,我在主循环中进行了大量处理,并定期在QProgressDialog中更新标签和百分比.
我的处理如下:从文件(numpy内存阵列)读取大量数据,进行一些信号处理,将输出写入常见的h5py文件.我遍历可用的输入文件,所有输出都存储在公共的h5py hdf5文件中.每个输入文件整个过程大约需要两分钟,并将一个CPU固定为100%.
目标:
如何使该过程不受阻碍,以便UI仍能响应?我仍然希望我的处理功能能够更新QProgressDialog及其关联的标签.
我可以扩展它以同时处理多个数据集并保持更新进度条信息的能力吗?
我可以从多个线程/进程/等中写入h5py吗?我必须对写操作实施锁定吗?
软件版本:
我将python 3.3与numpy / scipy / etc一起使用.用户界面位于PyQt4 4.11 / Qt 4.8中,尽管我对使用python 3.4(以及因此使用asyncio)或PyQt5的解决方案感兴趣.
解决方法:
这是一个非常复杂的问题,无法解决所有问题的完整答案.但是,我会尽力使您走上正确的道路.
How do I make this process non-blocking, so that the UI is still responsive? I’d still like my processing function to be able to update the QProgressDialog and it’s associated label.
要使其不阻塞,您需要将处理卸载到Python线程或QThread中.更好的是,将其卸载到一个子进程中,该子进程通过主程序中的线程将进度传达回主程序.
我将让您实现(或询问其他问题)创建子流程或线程.但是,您需要注意,只有MainThread才能访问GUI方法.这意味着如果您使用QThread或从python线程使用QApplication.postEvent(),则需要发出信号(我将后者包装到了Python 2.7 here的库中.Python3兼容性将有一天出现)
Can I extend this to process more than one dataset concurrently and retain the ability to update the progressbar info?
是.一个示例是产生许多子流程.每个子进程都可以配置为将消息发送回主进程中的关联线程,该主线程通过针对上述要点描述的方法将进度信息传递给GUI.您如何显示此进度信息取决于您.
Can I write into h5py from more than one thread/process/etc.? Will I have to implement locking on the write operation?
您一次不应从多个线程写入hdf5文件.您将需要实现锁定.我认为甚至应该将读取访问序列化.
我的一位同事已经为Python 2.7编写了类似的东西(请参见here和here),欢迎您看一下它,也可以根据需要对其进行分叉.