2013-12-21 99 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

相關問題