一尘不染

带有matplotlib的Python IPC

python

项目描述:

将现有的“ C”程序(主控件)连接到Python GUI / Widget。为此,我使用了FIFO。C程序旨在查看基于帧的遥测。

Python GUI执行两个功能:

  1. 根据用户需要通过GUI小部件运行/创建绘图(可能通过matplotlib创建)(各个.py文件,不同用户编写的脚本)
  2. 创建帧后,将帧号中继到python绘图脚本,以便在从主程序获得帧号后可以“更新”自身。

实施注意事项:

  1. 我猜测,在基于信号的体系结构中通过线程创建的绘图过多时,可能会变得比较滞后。我不确定它们何时会受CPU限制…大多数图都会更新一些线系列,有些会更新图像。不管我选择哪种创建方式,无论采用哪种方式都可能会很麻烦。

  2. 我不确定打开30个python进程是什么,每个进程使用matplotlib绘制一两个图都会对一台机器或其资源产生影响。我在系统上看到一个简单的matplotlib图,其RSS(已分配内存)为117M,因此,如果通过为每个图打开单独的进程来完成30个图,则我认为单个用户不会限制30个图。(具有多个同时用户的16 GB,32核Linux Box)

问题:

  1. 我是否应该通过线程或进程打开地块,一个地块会比另一个地块少?
  2. 如果我使用线程,那么有人会不知道有多少个matplotlib数字要更新才能在一个线程上落后吗?
  3. 如果将图创建为过程,是否应该使用多处理程序包?我猜想这个API可以直接在进程之间传递帧号吗?
  4. 鉴于我有可用的多处理功能,尝试通过POpen打开进程可能很愚蠢,对吧?我猜是这种情况,因为如果这样做,我将不得不自己设置所有管道/ IPC,这会做更多的工作吗?

阅读 216

收藏
2021-01-20

共1个答案

一尘不染

因此,我能够以两种方式实施该项目-使用和不使用多进程。

  1. 我在PyQt GUI中有一个主进程,带有一个线程,该线程从控制C程序的帧号的管道读取。
  2. 当用户选择图(.py脚本)时,可以选择按一批图上的“执行”按钮,以将其保留在主过程中。从这一点开始,如果框架被更新,则图将被连续更新。缓慢的变化几乎是在少数图之后立即开始发生的,但对于10-20个简单的时间序列图而言,这并不是禁止的。
  3. 有一个备用按钮,允许使用其他进程进行处理。我能够使用POpen和命名管道或多重处理和多重处理队列来做到这一点。最干净的方法是使我的其他进程创建图QObjects,并使用pyqt信号,其中每个其他进程都在该进程中创建QApplications来结束,但是我必须使用ctx = mp.get_context(’spawn’ ),因为默认情况下Linux使用fork,当我创建QApplication时,它认为QApplication已在主进程中运行。这是我能够获得可预测的多重处理行为的唯一方法,在该行为中,所有matplotlib图都将在替代过程中更新。

我读到matplotlib在网络上不是线程安全的,但是,从等待队列读取的线程发出的pyqt插槽读起来似乎不错。

我选择实现方式是为了使用户能够灵活地在同一过程中打开地块,或者在另一过程中打开一批地块,而不是每个过程都预先确定数量的地块,以为可能会创建某些具有复杂更新的地块,而这些地块应该得到他们自己的过程,可以这样选择。这也比简单进程的每个进程的进程浪费更少,每个进程最少100MB,而同一进程中每个额外的进程仅需要3MB左右的额外内存。

最后一个细节是用户可能非常迅速地切换框架。我让接收进程读取并在非阻塞守护程序线程中清空队列,并仅获取最新信息。一旦发送了用于更新绘图的信号,便由绘图更新循环抓住了线程锁,并且在更新方法释放了线程锁之后,读取的守护程序再次能够发出更新。

2021-01-20