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

时间:2011-02-25 06:26:01

标签: 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)来快速破解。这暂时解决了我的问题

5 个答案:

答案 0 :(得分:79)

正确答案是使用python stdlib的threading.Event

当然你可以调整你的睡眠间隔,这样你就可以在很短的时间内睡觉,但如果实际想要每60秒运行一次你的循环怎么办?然后你需要做更多的工作来确定是时候跑步还是继续睡觉。此外,你仍然在技术上阻止,但只是很短的时间。与threading.Event对比:

#!/usr/bin/env python2.7
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()

当信号处理程序调用{​​{1}}时,主线程的exit.set()调用将立即中断

现在,您可以使用wait()表示还有更多工作要做,等等。但在这种情况下,它会作为我们想要退出的方便指标(例如Event部分。)

您还可以选择在while not exit.is_set()循环后放置任何清理代码。

答案 1 :(得分:11)

当用户按下中断键Ctrl-C时,会引发KeyboardInterrupt异常。在python中,这是从SIGINT信号转换而来的。这意味着,您可以使用信号模块来处理它:

import signal

def handler(signum, frame):
    print "do whatever, like call thread.interrupt_main()"

signal.signal(signal.SIGINT, handler)

while 1:
    time.sleep(forever)

这样,你可以在收到键盘中断时做任何你想做的事。

答案 2 :(得分:9)

不确定这段代码是什么意思 - 但如果有必要,请使用较短的sleep()间隔并在其周围放置一个for循环:

for i in range(60):
   sleep(1)

使用try..except捕获 KeyboardInterrupt 异常是直截了当的

答案 3 :(得分:2)

我在Linux下使用python版本2.5,2.6,3尝试了你的代码,并且在按下CTRL-C时抛出了“KeyboardInterrupt”异常。

也许某些异常处理会捕获中断,或者您的问题是这样的: Why is KeyboardInterrupt not working in python?

答案 4 :(得分:0)

想到我会把它扔进去。

<repository>
    <id>archetype</id>
    <name>archetype_company_repo</name>
    <url>http://your.company.com/nexus/content/repositories/releases/</url>
</repository>