使用while语句持续监控状态
我正在尝试使用“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 个回答
你可能不想在一个循环里不停地去检查某个东西,尽可能快地让你的处理器工作。
试试这个:
while True:
pass
你会发现你的CPU现在使用率达到了100%(或者至少有一个核心是这样的)。
好吧,如果你不想让程序“睡觉”,那么是的,你会消耗一些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)就不是个好办法(尽管上面的代码看起来表明带小延迟的轮询是可行的)。
你需要重新设计一下,让程序根据中断来驱动,这样设备就能通知程序状态发生了变化。
你在问题中没有提供足够的信息(关于设备或环境),所以我只能给出一般性的建议,就是从轮询改为中断驱动的方式。
什么是“设备”?它真的是像硬件那样的设备吗?还是说它只是你的一部分软件?
不要一直去查询设备的状态,你需要重新设计一下,让设备在状态改变时发出一个信号,然后你可以用一个回调函数来注册对这个信号的关注。
你可以去网上搜索一下观察者设计模式,这里有一个我以前用过的不错的Python例子:http://code.activestate.com/recipes/131499-observer-pattern/