我需要使用ctrl c从time.sleep()中断.
While 1:
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,当控件进入time.sleep函数时,需要经过整整60秒才能处理CTRL C
有没有优雅的方式来做到这一点.这样我即使在控制时间内也可以中断.睡眠功能
编辑
我在一个遗留实现上测试它,在Windows 2000上使用python 2.2导致了所有的麻烦.如果我使用了更高版本的python CTRL C会中断sleep().我通过在for循环中调用sleep(1)来快速破解.这暂时解决了我的问题
tho*_*nic 94
将正确的答案是使用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()
Run Code Online (Sandbox Code Playgroud)
当信号处理程序调用时exit.set()
,主线程的wait()
调用将立即被中断.
现在,你可以使用一个Event
来表示还有更多的工作要做,等等.但是在这种情况下,它确实是双重任务,作为我们想要退出的方便指标(例如,while not exit.is_set()
部分).
您还可以选择在while
循环后放置任何清理代码.
小智 10
不确定这段代码是什么意思 - 但如果有必要,请使用较短的sleep()间隔并在其周围放置一个for循环:
for i in range(60):
sleep(1)
Run Code Online (Sandbox Code Playgroud)
使用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)
while 1:
time.sleep(forever)
Run Code Online (Sandbox Code Playgroud)
这样,您可以在收到键盘中断时执行任何操作.
归档时间: |
|
查看次数: |
46820 次 |
最近记录: |