我有一个程序,它花了很多时间在无限循环中睡着了,它每隔6小时就会检入另一个系统API,如果有变化会有一些东西,如果没有再回到睡眠状态。
没有列出所有代码,它非常简单;我有
while True:
do some stuff
time.sleep(21600)
打破这个问题的唯一方法是使用CTRL + C,但这看起来很难看,有没有办法让另一个keypess中断time.sleep()并使用一个优雅的sys.exit()?
答案 0 :(得分:2)
我不知道它是否正是您要搜索的内容,但我找到了使用pynput的解决方案。
以下实现基本上是他们添加了循环的reference implementation。
from pynput import keyboard
from time import sleep
exit_flag = False
def on_press(key):
try:
print('alphanumeric key {0} pressed'.format(key.char))
except AttributeError:
print('special key {0} pressed'.format(key))
def on_release(key):
print('{0} released'.format(key))
if key == keyboard.Key.esc:
global exit_flag
exit_flag = True
print("SET EXIT TO {}".format(exit_flag))
return False
with keyboard.Listener(on_press=on_press,
on_release=on_release) as listener:
print("listen...")
while not exit_flag:
print("do something...")
sleep(2)
listener.join()
全局退出条件的解决方案并不是最干净的解决方案,但它确实起到了作用。
修改强>
我意识到你想在睡眠期间实际退出,这对于提议的实现也是不可能的。但是它可以选择捕获键盘中断并执行sys.exit()吗?将是一个非常简单的解决方案。
import time
import sys
while True:
try:
print("do something")
time.sleep(10)
except KeyboardInterrupt:
print("to be able to exit script gracefully")
sys.exit()
答案 1 :(得分:0)
我没有写任何代码,但这是我的想法......而不是像 sleep(21600)
这样的大睡眠时间创建一个运行 21600*1000 次并睡眠一毫秒的循环,并在该循环中保持监听键盘中断或按键。代码会很丑,所以我建议使用抽象。
附言为什么 21600*1000 而不是“21600 并睡一秒”,一秒并不准确。您在 sleep(1)
处于活动状态时按下键盘中断的可能性比您使用毫秒或微秒时要大。