gpt4 book ai didi

python - 循环检测系统挂起

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:10:07 25 4
gpt4 key购买 nike

我正在尝试使用以下算法检测系统挂起:

while True:
lastchecked = now()
if now() - lastchecked > 1s: print "suspend detected!"

但我遇到了一个问题:如果挂起发生在第 2 行和第 3 行之间,那么循环会捕获它。但如果挂起发生在第一行和第二行之间,则算法失败。

这种情况有什么常用的方法吗?最好与操作系统无关,我不想 Hook 操作系统事件等。

最佳答案

首先,polling is inferiour to notifications因为它浪费了本可以用于有用工作的系统资源(并且您当前的循环也是 busy loop )。自然地,电源管理事件系统是特定于操作系统的(请参阅 Power Management Notifications in Linuxhow to hook to events / messages in windows using python ),但如果您正在编写系统监视器应用程序,则无论如何都无法隐藏操作系统差异。


现在,这里的关键是在内存中始终有两个时间戳并覆盖旧的:

T1
\
T2
<- compare
/
T3
<- compare
\
T4
etc
/

然后,无论何时发生挂起,下一个时间戳都会被设置得比它应该的晚,比较就会看到差异。

这样,您甚至不需要每秒左右轮询一次!您的轮询间隔只需要与您想要检测的最短暂停时间一样短。例如。如果你想检测至少 30 秒的暂停时间,你只需要每 30 秒轮询一次:如果系统休眠时间更长,它肯定会“错过一个节拍”。

i=0
poll_period=30
t=[time.time()]*2
while True:
# actually, poll period will be slightly longer due to code overhead:
# https://stackoverflow.com/questions/26774186/looping-at-a-constant-rate-with-high-precision-for-signal-sampling
# but that doesn't make a difference in this case
time.sleep(poll_period)
t[i]=time.time()
if t[i] - t[(i+1)%2] > poll_period + 2: print "suspend detected"
i = (i+1)%2

请注意 you will get false positives if your process gets preempted by others .这也是为什么使用系统通知是一种非常优越的方式的另一个原因。

关于python - 循环检测系统挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50785588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com