使用while语句持续监控状态

2 投票
3 回答
1287 浏览
提问于 2025-04-17 11:02

我正在尝试使用“While True”语句不断监控一个设备的状态。这个项目快完成了,但在投入使用时遇到了一些问题。

代码:

while True:
    # monitor the state of this device..
    # when ever this device state changes .
    # raise an alert.
    # 
    break

这是它工作的算法。但是当我试图持续监控系统时,CPU的使用率一直很高,脚本持续占用大约30%的CPU。我想把这个使用率降到零。请问在Python中有可能做到吗?

我不能使用time.sleep(sec),因为这个监控必须非常精确。请帮我解决这个问题。

3 个回答

0

你可能不想在一个循环里不停地去检查某个东西,尽可能快地让你的处理器工作。

试试这个:

while True:
    pass

你会发现你的CPU现在使用率达到了100%(或者至少有一个核心是这样的)。

1

好吧,如果你不想让程序“睡觉”,那么是的,你会消耗一些CPU资源。这并不一定是坏事。如果没有其他程序需要使用CPU,那么把它用到100%也是可以接受的,当然这不考虑省电的问题。

如果你担心的是不想等整整一秒钟来捕捉事件,你可以提供一个小数值:

import time
time.sleep (0.1)

下面这两个程序的区别显示了即使是小的延迟也能有所帮助,这是在Ubuntu 11.04和Python 2.7.1下运行top命令的结果:

# Will peg at 100%         # Won't even reach 1%
import time                import time
while True:                while True:
    pass                       time.sleep(0.01)
                               pass

如果你在评论中提到的意思是你不想在设备状态改变之前使用任何CPU,那么轮询(polling)就不是个好办法(尽管上面的代码看起来表明带小延迟的轮询是可行的)。

你需要重新设计一下,让程序根据中断来驱动,这样设备就能通知程序状态发生了变化。

你在问题中没有提供足够的信息(关于设备或环境),所以我只能给出一般性的建议,就是从轮询改为中断驱动的方式。

2

什么是“设备”?它真的是像硬件那样的设备吗?还是说它只是你的一部分软件?

不要一直去查询设备的状态,你需要重新设计一下,让设备在状态改变时发出一个信号,然后你可以用一个回调函数来注册对这个信号的关注。

你可以去网上搜索一下观察者设计模式,这里有一个我以前用过的不错的Python例子:http://code.activestate.com/recipes/131499-observer-pattern/

撰写回答