2015-09-04 86 views
0

我目前正在研究通过串行通信获取连续绘图数据的代码,同时还允许以raw_input形式的用户输入来控制作业,例如启动/停止/清除绘图并设置数据的保存文件名称。目前,我正在尝试通过使用额外的线程来读取用户输入并将其中继到程序,同时连续绘制和保存数据。Python:使用matplotlib和用户输入的线程化/多处理

不幸的是,我遇到了一些错误,其中在绘图循环过程中输入的命令将程序冻结了2分钟左右,我相信这与matplotlib不是线程安全的,在循环中输入命令不与绘图库一起工作会在1-2秒内产生响应。

我试图从线程切换到多处理库,试图缓解问题无济于事,程序不会显示图表,导致我相信绘图过程从不开始(绘图命令是第一个命令在里面)。如有需要,我可以发布代码或两个程序的相关部分。

我想知道是否有解决这些问题的方法,或者我是否应该开始重新考虑如何编程。任何有关结合用户输入的不同方式的建议也受到欢迎。

感谢

回答

0

如果matplotlib是不是线程安全的,做正确的事是通过一个单一的事件queue连载所有的投入matplotlib。 Matplotlib可以从队列中检索项目,直到队列为空,然后处理所有新参数。

你的串行通信代码和你的raw_input应该简单地把数据放在这个队列上,而不是试图与matplotlib直接通信。

您的matplotlib线程将执行以下三件事之一:(1)等待新数据; (2)检索新数据并对其进行处理(例如,将其附加到要绘制的数组或更改输出文件名)并保持此状态,只要队列不是空的,或者如果它是空的,则继续处于状态(3) ;或(3)调用matplotlib进行绘图,然后循环回到状态(1)。

如果您正在从raw_input实施多个操作命令,则可以添加一些辅助状态变量。例如,如果从队列中读取“stop”,那么您将设置一个变量,该变量会导致状态(3)跳过绘图并直接进入状态(1),并且如果从队列中读取“start”你会重置这个变量,并且会在收到数据时恢复绘图。

你可能会认为你想要做一些像下面这样的事情:“如果我看到数据,请等我确定在我开始绘图之前不会有更多的东西来。”这通常是一个错误。你必须非常仔细地调整你的等待时间,然后仍然会发现你的绘图从未发生过的时间,因为输入数据的时间。如果您已收到数据(您处于状态2),并且队列为空,则可以绘制!在这么做的时候,如果再有4个数据点进来,那么下次再绘制4个点...

+0

谢谢。这工作完美。 –