繁体   English   中英

中断/中断 python 中的 time.sleep()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM