我正在构建一个运行在Raspberry Pi上并通过串行端口与设备通信的Python3 / PyQt4应用。
串行端口在其自己的线程中运行。要将消息发送到设备,请使用Queue()。 GUI中的计时器每秒将大量消息放入队列。串行线程通过超时和重试一个接一个地处理它们,并在收到有效响应时使用信号/插槽通知GUI(在主线程中)。
我遇到的问题是CPU使用率(受顶部监视)随着时间的推移缓慢增加,最终上升到100%以上(一个小时左右后,我发现大约150-170%)。串行线程中有一个while(True)循环;增加一点睡眠时间(例如10至50毫秒)可以降低总体CPU使用率,但最终仍然会发生相同的行为。
奇怪的是,如果我运行该应用程序但从不启动计时器(因此不会发生串行通讯),则CPU使用率一直稳定在100%左右。
我尝试过使用strace,它告诉我在futex上花费了很多时间(30-50%),但是我从来没有看到任何东西达到100%左右。
编辑: 原来,我的问题与串行通讯,线程或QTimer()几乎没有任何关系。我最终发现这是由于我在GUI中滥用了对象。我已在下面的答案中发布了问题的原因。因此,我还删除了实际上不是原因的smaple代码。
答案 0 :(得分:0)
当我完成剥离代码副本以查找原因的过程时,答案实际上与线程或串行通讯无关。
在我的GUI中,我有一些简单的对象,这些对象将QGraphicsView子类化并绘制圆圈(实际上,它是一个LED的模仿物,用于指示通信活动的好坏)。
当我想更改圆形的颜色时,实际上我再次在对象中调用了drawEllipse()。更糟的是,每秒发生多次。 (做我最初“模拟”项目时做的一种讨厌的方式。)因此,解决方法是双重的:
重组代码仅每秒设置两次LED状态(一次开始查询设备寄存器,一次完成)
使用here
通过这些修复程序,CPU使用率保持稳定在40%左右(并且代码更简洁)。