[英]Python: Threading/multiprocessing with matplotlib and user input
我目前正在编写一个代码,该代码将连续地通过串行通信检索绘图数据,同时还允许用户以raw_input的形式输入以控制作业,例如开始/停止/清除绘图并设置保存文件名。数据。 当前,我正在尝试通过一个额外的线程来做到这一点,该线程将在连续绘制和保存数据时读取用户输入并将其中继到程序。
不幸的是,我遇到了一些错误,在绘图循环中输入的命令将程序冻结了2分钟左右,我认为这与matplotlib线程不安全有关,而在循环不起作用的情况下输入了命令绘图库将在1-2秒内导致响应。
我试图从线程切换到多处理程序库,以试图缓解该问题,但是该程序将不会显示绘图,因此使我相信绘图过程永远不会开始(plotting命令是其中的第一个命令)。 如有必要,我可以发布代码或任何程序的相关部分。
我想知道是否有解决这些问题的方法,或者我是否应该重新考虑如何编程。 也欢迎就合并用户输入的不同方式提出任何建议。
谢谢
如果matplotlib不是线程安全的,则正确的做法是通过单个事件队列将所有输入序列化为matplotlib。 Matplotlib可以从队列中检索项目,直到队列为空,然后处理所有新参数。
您的串行通信代码和raw_input应该只将数据放在此队列中,而不要尝试与matplotlib直接通信。
您的matplotlib线程将做以下三件事之一:(1)等待新数据; (2)检索并处理新数据(例如,将其附加到要绘制的数组或更改输出文件名),并在队列不为空的情况下保持此状态,如果队列为空,则进入状态(3) ; 或(3)调用matplotlib进行绘制,然后循环回到状态(1)。
如果要从raw_input实现多个操作命令,则可以添加一些辅助状态变量。 例如,如果从队列中读取了“停止”,那么您将设置一个变量,该变量将导致状态(3)跳过绘图并直接进入状态(1),并且如果从队列中读取了“开始”,您将重置此变量,并在接收到数据后恢复绘图。
您可能会认为自己想做些类似的事情:“如果我看到数据,请在开始绘制之前,请确保没有更多数据出现。” 这通常是一个错误。 您必须非常仔细地调整等待时间,然后仍然会因为输入数据的时间而找到从未进行绘图的时间。 如果您已收到数据(处于状态2),并且队列为空,则只需绘图即可! 在此过程中,如果再输入4个数据点,则下次将绘制4个数据点...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.