用PyQt5进行Matplotlib(多)线程处理

时间:2017-04-07 11:59:42

标签: python matplotlib pyqt5 python-multithreading

我正在尝试使用Matplotlib开发PyQT5应用程序,其结构与How to use a Qthread to update a Matplotlib figure with PyQt?

中接受的答案类似

我面临的问题是表现。对应用程序的要求是多个(最多约20个)matplotlib图,它们随机更新,但通常在几毫秒内。每个图表都有200-2000个对象(主要是线条和矩形)。我尽可能地优化了绘图过程,但是根据图表上的对象数量,我每张图表的绘制时间大约为40-300ms。

我希望至少使用qthread将绘图过程(主要是.draw()和/或使用figure()的任何内容)卸载到另一个线程以保持gui响应,但是似乎所有绘图都必须在主线程中完成。因此,任何其他线程解决方案(如多进程或类似方法)也不起作用。

基本上,最糟糕的情况是szenario,如果所有20个图表同时更新,gui将无响应20 * 300ms。据我了解,使用QMdiSubWindow不会导致该子窗口使用额外的线程,因此在更新所有图形之前,完整的gui会冻结。

我看到以下解决此问题的方法:

  • 切换到另一个绘图库,可能是绘图过程的一部分可以被线程化(或者性能更好,更好)。建议?
  • 切换到另一种编程语言(即Java和Qt Jambi。但是,绘图必须在Qt应用程序的主线程中完成的规则​​是否也适用于那里?)
  • 产生多个独立的主要gui进程,每个图形一个(每个图形一个窗口),让它们与分发图表客户端应该绘制的数据的服务器进程通信。
  • 在子线程/多进程线程中使用matplotlib,但不是作为小部件。而是创建一个图像,将该图像返回到主要过程进行显示。这可能会增加更多的显示延迟(但会大大提高gui的响应速度),并且与现在的图像交互会更加困难,并可能导致交互选项减少。可能是一个非常不干净的解决方案。

我了解情况吗?还有其他更好的方法吗?

0 个答案:

没有答案