2013-12-21 73 views
4

级别初学者 我在Ubuntu上使用python 2.7版本。 我有一个关于Python中的小代码片段的困惑。我知道Python中的while True意味着无限循环。我有以下代码:随着时间的推移混乱Python中的“while True”循环

#!/usr/bin/env python 
import signal 
import time 

def ctrlc_catcher(signum, frm): 
    print "Process can't be killed with ctrl-c!" 

def alarm_catcher(signum,frame): 
    print "Got an alarm" 


signal.signal(signal.SIGINT, ctrlc_catcher) 
signal.signal(signal.SIGALRM, alarm_catcher) 


while True: 
    signal.alarm(1) 
    pass 

当我执行PROGRAMM输出是空白的,当我按下Ctrl-C键将显示“过程不能.....”消息。 我的问题是为什么signal.alarm(1)不工作? 但是,如果我把使用

while True: 
    signal.alarm(1) 
    time.sleep(1) 
    pass 

它,然后报警被触发,并在输出画面我看到后,每一秒“得到一个警报”消息后,一个小小的停顿。 什么是time.sleep(1)这样可以触发警报? 谢谢

回答

7

在第一个例子中,你不断地重置警报。您从现在开始设置一秒钟的闹钟,然后0.00001秒后,您从现在开始设置闹钟1秒钟,然后0.00001秒后,您从现在开始设置闹钟1秒钟...因此,未来闹钟总是1秒钟!在第二个示例中,通过睡眠,您可以在重置闹钟之前允许1秒钟通过,因此实际上有时间关闭。

我想你的意思是你的第一个例子写的是

signal.alarm(1) 
while True: 
    pass 
+0

我试过这段代码了。我的想法是无限期地每隔1秒产生一次报警,你提到的代码只会产生一次报警。 –

+0

+1 @hobbs是正确的,设置闹钟将取消以前的闹钟,从而结束无限设置/取消闹钟。 – alvits

+0

@pss然后,您必须在警报处理程序中重新安排警报(不确定是否允许)或在主循环中设置要评估的标志。 – glglgl

5

的问题是,你是在写你的报警。以下是从signal docs

signal.alarm(time)

time如果非零,即一个 SIGALRM信号在time秒被发送到处理该函数请求。 以前的任何 预定警报被取消(只有一个警报可以在任何 时间安排)。

+0

+1用于发布signal.alarm的手册页。这显然不会让任何人产生混淆(如果这是一个词)。 – alvits

相关问题