[英]break/interrupt a time.sleep() in python
我需要使用 ctrl c 从 time.sleep() 中断。
While 1:
time.sleep(60)
在上面的代码中,当控件进入 time.sleep 函数时,python 需要整整 60 秒来处理 CTRL C
有没有什么优雅的方法来做到这一点。 这样即使控制在时间我也可以中断。睡眠功能
编辑
我在遗留实现上测试它,它在 Windows 2000 上使用 python 2.2,这导致了所有的麻烦。 如果我使用更高版本的 python CTRL C 会中断 sleep() 。 我通过在 for 循环中调用 sleep(1) 进行了快速破解。 暂时解决了我的问题
正确答案是使用python stdlib的threading.Event
当然你可以调低你的睡眠间隔,这样你就可以睡很短的时间,但是如果你真的想每 60 秒运行一次循环怎么办? 然后你需要做更多的工作来确定是该跑步还是继续睡觉。 此外,您在技术上仍然处于阻塞状态,但只是很短的一段时间。 对比threading.Event
:
from threading import Event
exit = Event()
def main():
while not exit.is_set():
do_my_thing()
exit.wait(60)
print("All done!")
# perform any cleanup here
def quit(signo, _frame):
print("Interrupted by %d, shutting down" % signo)
exit.set()
if __name__ == '__main__':
import signal
for sig in ('TERM', 'HUP', 'INT'):
signal.signal(getattr(signal, 'SIG'+sig), quit);
main()
当信号处理程序调用exit.set()
,主线程的wait()
调用将立即被中断。
现在,您可以使用Event
来表示还有更多工作要做,等等。但在这种情况下,它作为我们想要退出的方便指示器具有双重作用(例如while not exit.is_set()
部分。)
您还可以选择在while
循环之后放置任何清理代码。
不知道这段代码的意义是什么 - 但如果有必要,使用较短的 sleep() 间隔并在它周围放置一个 for 循环:
for i in range(60):
sleep(1)
使用 try..except 捕获KeyboardInterrupt异常很简单
当用户按下中断键 Ctrl-C 时,会引发 KeyboardInterrupt 异常。 在 python 中,这是从 SIGINT 信号转换而来的。 这意味着,您可以使用信号模块随意处理它:
import signal
def handler(signum, frame):
print("do whatever, like call thread.interrupt_main()")
signal.signal(signal.SIGINT, handler)
print("Waiting for SIGINT...")
signal.pause()
这样,您可以在收到键盘中断时做任何想做的事情。
最优雅的解决方案当然是threading.Event
,但如果您只需要快速破解,此代码效果很好:
import time
def main():
print("It’s time !")
if __name__ == "__main__":
print("press ctrl-c to stop")
loop_forever = True
while loop_forever:
main()
try:
time.sleep(60)
except KeyboardInterrupt:
loop_forever = False
我在 Linux 下使用 python 版本 2.5、2.6、3 尝试了您的代码,并且在按 CTRL-C 时都抛出了“KeyboardInterrupt”异常。
也许某些异常处理会捕获中断,或者您的问题是这样的: 为什么 KeyboardInterrupt 在 python 中不起作用?
基于@Andreas Jung 的回答
for i in range(360):
try:
sleep(1)
except KeyboardInterrupt:
sys.exit(0)
想我会把这个扔进去。
import time
def sleep(seconds):
for i in range(seconds):
try:
time.sleep(1)
except KeyboardInterrupt:
print("Oh! You have sent a Keyboard Interrupt to me.\nBye, Bye")
break
sleep(60)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.