2011-12-08 87 views
6

* nix python信令允許我在睡眠準備就緒之前停止睡眠。在Windows中是否有類似的機制 - 似乎所有的方法最終只能在睡眠之後攔截代碼?有沒有辦法停止Windows中的time.sleep?

代碼示例:

from time import sleep 
.. do something that will intercept the sleep 
try: 
    sleep(60) 
finally: 
    print 'how to get here under 60 seconds in windows?' 

在沒有窗戶的回答類似的問題: break/interrupt a time.sleep() in python

signal
+5

你可以編寫代碼,等待一個'threading.Event',超時時間爲60秒,如果你想取消等待,從另一個線程中選擇該事件? –

+1

首先閱讀解析經典標點符號的句子。希望有一種方法可以通過在某個地方睡覺來停止時間。 – Simon

+0

這不是我的代碼。這是未知的客戶端代碼,我試圖超時發生後停止。看來,在cpython中沒有真正好的機制存在..是的,我們也嘗試過線程和子進程是不行的。 – mkorpela

回答

4

Python的文件說:

•雖然Python的信號處理程序被異步調用到Python用戶所關心的 ,它們只能在第e「原子」 Python解釋器的指令。這意味着在長時間計算期間到達的信號純粹用C實現(例如 大型文本主體上的正則表達式匹配)可能會延遲 任意一段時間。

time說:

實際暫停時間可能小於要求的,因爲任何 抓到信號將終止此之後 信號的捕獲程序的執行睡眠()。

在Windows上,顯然time.sleep()未按照文檔中得到實現,因爲在睡眠時接收到的信號處理程序後,直到睡眠的整個持續時間結束後未採取行動。下面的例子:

import signal, time 

def handler(signum, frame): 
    print('Signal handler called with signal', signum) 

signal.signal(signal.SIGINT, handler) 

print("signal set, sleeping") 
time.sleep(10) 
print("sleep done") 

打印:

signal set, sleeping 
Signal handler called with signal 2 
sleep done 

與第一線立即出現和第二兩個10秒後,無論何時中斷髮生的。

正如Thomas K所言,更好的策略是使用線程和同步。

1

我不知道這是否會爲你做的,但這裏有一個小的解決方法,你可以這樣做:

for i in range(60): 
    if checkIfIShouldInterruptSleep(): 
     break 
    time.sleep(1) 
print "Finished Sleeping!" 

這只是精確到秒,但它可能會成爲你的目的。快樂的編碼!

相關問題