2016-06-28 30 views
0

我有如下所示的代碼:我該如何讓python實時入睡?

while True: 
    do things over the internet: 
    time.sleep(3600) 

我想time.sleep()運行,即使計算機處於睡眠狀態或者說我沒有登錄。例如,如果我啓動程序,請等待半小時,註銷(或讓機器進入睡眠狀態),並在一小時後回來,我希望它再次運行,並在下一個週期的半小時內運行等候。

+2

你在使用什麼操作系統?如果它的Mac OS X或Linux的某種類型,我會建議你使用Crontab代替 – SAMO

+0

由於「實時」有一個超載的含義,我建議改爲「掛鐘時間」或「絕對時間」。 – deceze

+0

在模塊中有time.clock(),你可以在另一個while循環中使用它。 – Sosel

回答

3

您可以節省時間並且每隔一分鐘左右檢查一次, (僞)

lastDone = None # Avoid unbound local errors 
while True: 
    if lastDone is None or is_one_hour_ago(lastDone): # Write is_one_hour_ago() 
     # Do things 
     lastDone = time.now() # Not a real function yet 
    else: 
     sleep(600) # Sleep for a minute and check again 

is_one_hour_ago可能需要datetime模塊,但相對簡單的邏輯,一旦你得到它寫(如果現在回到真實減去一個時> = lastDone否則返回False),你會需要看看python的datetime模塊。或時間的clock

值得注意的是,解釋器無法在計算機休眠時運行,但打開後它會立即運行,除此之外,它會準確無誤。

+0

準確度與您入睡的時間一樣高,所以如果您一分鐘就睡一會兒,您可能會有一分鐘的偏差。 – syntonym

+0

它通常是一個Unix單位,即0.001秒,並且它在循環中不使用100%CPU的情況下獲得精確度。另外,當你知道響應可能有些精確或緩慢時,通常會進行更長的暫停。例如,當個人電腦閒置時,用戶不希望得到他/她應該得到的任何東西。當然,全部取決於程序的目的。 – Dalen

1

您應該看到,但是當您的機器進入睡眠狀態時time.sleep()可能會中斷。

當一些其他的事情發生時,如KeyboardInterrupt,它會中斷。因此,將sleep()放入try語句中,並使用time.clock()或time.time()來查看sleep()中斷和下一次循環連續發生之間經過多長時間以繼續睡眠,或者只是讓它中斷:

try: time.sleep(360) 
except: pass 

因此,程序應該繼續沒有任何錯誤。但是,如果它不那麼容易,那麼您將不得不使用信號和/或服務管理讓操作系統通知您的進程它應該繼續運行或啓動睡眠過程(以註銷方式休眠,不是循環的實際睡眠)。

查看,當操作系統要註銷或關閉,或進入休眠狀態時,它會以某種事件,信號或服務暫停的形式發送通知。 睡眠,有點特別,並不是所有的操作系​​統都如此。

你必須抓住這一點,並做一些有用的事情。

信號您完成信號模塊管理,

事件是特定的系統,它可能是複雜的。在Mac OS X上,它可以是任何來自AppScript或事件隊列上的高級別事件,或MacPort消息,這些事情使事情複雜化,但API已經存在,不用擔心。

在Windows上,您可能必須使用win32types winservice模塊來創建有用的服務管理。

請注意,當OS關閉或註銷時,它會向進程發送信號。如果進程沒有響應並退出,它通常詢問用戶是否應該退出它,或者只是殺死進程。

因此,您必須相應地註冊您的進程,使其不會終止,即它必須是服務或守護進程。

要解決從睡眠模式返回的問題,最好使用threading.Timer()來完成您的工作。

這是一個線程,它會調用您在指定時間後註冊的函數。

在啓動它之前,您將其模式更改爲守護進程,並讓主循環捕獲事件或信號或任何其他信息。

當時間流逝,你的功能將會運行。然後你可以通知主循環停止其他處理並完成你的工作。

如果循環檢測到從睡眠中返回或登錄,它可以直接調用您的函數並重新啓動計時器。

當你得到它的一切,這很容易,不用擔心。只是要閱讀很多。 :D

可能有很多其他解決方案。

就像自動啓動一些登錄過程中的一些小流程,說你的過程中它應該做些什麼等。現在都取決於你的創造力。