簡體   English   中英

如何讓python實時睡眠?

[英]How can I make python sleep in real time?

我有看起來像的代碼:

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

我希望time.sleep()能夠運行,即使我的計算機處於睡眠狀態或未登錄也是如此。 例如,如果我啟動程序,等待半個小時,注銷(或使機器進入睡眠狀態),然后在一個小時后返回,我希望它可以再次運行,並在下一個周期中等待半個小時。等候。

您可以節省時間,每分鍾左右檢查一次,例如(pseudocode)

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模塊,但是一旦寫完就比較簡單(如果現在減去一小時,則返回True,如果=> lastDone否則為False),則需要查看python的datetime模塊。 或時間的clock

值得注意的是,解釋器無法在計算機睡眠時運行,但是它將在您打開計算機后立即運行,除此之外,通過睡眠它是准確的。

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

當發生其他事情時,它會中斷,例如KeyboardInterrupt。

因此,將sleep()放入try語句中,並使用time.clock()或time.time()來查看sleep()中斷與下一次發生循環繼續之間的時間間隔以繼續休眠,或者只是使其中斷有:

try: time.sleep(360)
except: pass

因此,該程序應繼續運行而不會出現任何錯誤。

但是,如果那樣做不那么簡單,則您將不得不使用信號和/或服務管理來使OS通知您的進程它應該繼續運行或開始睡眠過程(從注銷的角度來說是睡眠,而不是實際的睡眠)一個循環)。

看,當OS要注銷或關閉或進入睡眠狀態時,它將以某種事件,信號或服務暫停的形式發送通知。 睡眠在某種程度上是特定的,並非在所有操作系統上都如此。

您必須抓住這一點並對其做一些有用的事情。

您通過信號模塊管理的信號

事件是特定於系統的,並且可能很復雜。 在Mac OS X上,它可以是AppScript或事件隊列中的高級事件,也可以是使事情復雜化的MacPort消息,但是API在那里,不用擔心。

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

請注意,當操作系統要關閉或注銷時,它將向進程發送信號。 如果進程不響應並退出,它通常會詢問用戶是否應退出該進程,或者只是終止該進程。

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

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

它是一個線程,它將在指定時間后調用您注冊的函數。

您可以在啟動它之前將其模式更改為守護程序,並離開主循環以捕獲事件或信號等。

當時間過去時,您的函數將運行。 然后,您可以通知主循環停止其他處理並完成您的工作。

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

當您掌握了一切之后,就很容易了,不用擔心。 只是很多閱讀。 :d

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

就像在登錄時自動啟動某個小流程,告訴您該流程應該執行某些操作等。現在,一切都取決於您的創造力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM