因此,我能够以两种方式实施该项目-使用和不使用多进程。
- 我在PyQt GUI中有一个主进程,带有一个线程,该线程从控制C程序的帧号的管道读取。
- 当用户选择图(.py脚本)时,可以选择按一批图上的“执行”按钮,以将其保留在主过程中。从这一点开始,如果框架被更新,则图将被连续更新。缓慢的变化几乎是在少数图之后立即开始发生的,但对于10-20个简单的时间序列图而言,这并不是禁止的。
- 有一个备用按钮,允许使用其他进程进行处理。我能够使用POpen和命名管道或多重处理和多重处理队列来做到这一点。最干净的方法是使我的其他进程创建图QObjects,并使用pyqt信号,其中每个其他进程都在该进程中创建QApplications来结束,但是我必须使用ctx = mp.get_context(’spawn’ ),因为默认情况下Linux使用fork,当我创建QApplication时,它认为QApplication已在主进程中运行。这是我能够获得可预测的多重处理行为的唯一方法,在该行为中,所有matplotlib图都将在替代过程中更新。
我读到matplotlib在网络上不是线程安全的,但是,从等待队列读取的线程发出的pyqt插槽读起来似乎不错。
我选择实现方式是为了使用户能够灵活地在同一过程中打开地块,或者在另一过程中打开一批地块,而不是每个过程都预先确定数量的地块,以为可能会创建某些具有复杂更新的地块,而这些地块应该得到他们自己的过程,可以这样选择。这也比简单进程的每个进程的进程浪费更少,每个进程最少100MB,而同一进程中每个额外的进程仅需要3MB左右的额外内存。
最后一个细节是用户可能非常迅速地切换框架。我让接收进程读取并在非阻塞守护程序线程中清空队列,并仅获取最新信息。一旦发送了用于更新绘图的信号,便由绘图更新循环抓住了线程锁,并且在更新方法释放了线程锁之后,读取的守护程序再次能够发出更新。
一些基本实现示例代码:https :
//stackoverflow.com/a/49226785/8209352



