当前位置: 首页 > 面试题库 >

带有matplotlib的Python IPC

锺离边浩
2023-03-14
问题内容

项目描述:

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

Python GUI执行两个功能:

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

我有几个问题-
了解此处看到的多处理与多线程的优缺点:多处理与线程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,这会做更多的工作吗?

问题答案:

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

  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左右的额外内存。

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

一些基本实现示例代码:https :
//stackoverflow.com/a/49226785/8209352



 类似资料:
  • 问题内容: 代码行: 错误: ImportError:没有名为“ matplotlib”的模块 问题: matplotlib在哪里安装? 一些注意事项: 操作系统:Linux Mint 17.2 我需要使用Python 3.4 解决方案: (对此不满意)。 使用或(接收错误,我也不喜欢这一点)。 使用(可能是完美的选择,但在python2.7目录中安装了matplotlib)。 我如何使Matpl

  • 我有2个点(大小为8的向量)和3个不同的位运算(和,或,Xor),我在2D绘图上映射了每个点和位运算的结果。现在,我想显示每个点的真实数据本身以及绘图旁边的操作结果(绘图的右侧或绘图上方(只要可能或更好)),以便以后在分析结果时,可以轻松读取数据值。现在我的图像是这样的,你可以看到图例被切断了,我在绘图之外没有地方写任何东西: 我要在绘图之外显示的文本: 我正在使用的代码:

  • 问题内容: 阅读以下文章,我设法将图例放在情节之外。 如何将图例排除在情节之外 码: 显示正确的绘图,并在其外部带有图例。但是,当我使用将文件另存为文件时,图例将被截断。 一些谷歌搜索显示了变通方法,例如add或to ,但都没有用。 正确的方法是什么?Matplotlib版本是0.99.3。 谢谢。 问题答案: 问题是,当您动态绘图时,会自动确定边框以适合所有对象。保存文件时,操作不会自动完成,因

  • 问题内容: 我想在matplotlib中渲染一个卷。该体积是一个简单的7x7x7多维数据集,并且我希望能够看到所有内部体素(即使我知道它看起来像一团糟)。 我已经能够渲染透明的体素,但是似乎从未绘制过表面上没有的任何体素。 该卷的每个7x7切片应如下所示: 我汇集了MWE 以下代码使用5x5的红色,绿色,蓝色,黄色和青色层创建5x5x5的体积。每层的Alpha设置为.5,因此整个过程应该是透明的。

  • 我刚开始在R中使用网状包,我仍然在解决一些问题。特别是,导入matplotlib的过程并不顺利。我尝试了两种不同的方法,每种方法都有不同的错误消息。 首先,在RStudio的交互式shell中使用repl_python: 打开的REPL-Python shell似乎拥有正确的版本和所有内容,但当我尝试导入matplotlib时。pyplot,我看到了以下内容: /lib/x86_64-linux-

  • 我有一个数据框架,df,就像: 我想绘制两个垂直条形图,每个大陆一个,并排,共享相同的y轴。我已经完成了90%的工作,除了将条的高度添加到子图中。到目前为止,我的代码: 我在这里和那里看到过带有标签的示例,但这些往往只适用于一个条形图,而不是几个子图。