av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

為什么不建議使用Time.Sleep實現(xiàn)定時功能?

有時候,我們想實現(xiàn)一個非常簡單的定時功能,例如讓一個程序每天早上8點調(diào)用某個函數(shù)。但我們又不想安裝任何第三方庫,也不會使用 crontab 或者任務(wù)計劃功能,就想使用純 Python 來實現(xiàn)。

可能有同學(xué)會這樣寫代碼:

 
 
 
 
  1. import time 
  2. import datetime 
  3.  
  4.  
  5. def run(): 
  6.     print('我是需要被每天調(diào)用的函數(shù)') 
  7.  
  8. def schedule(): 
  9.     target_time = datetime.time(8, 0, 0) 
  10.     today = datetime.date.today() 
  11.     target_date = today + datetime.timedelta(days=1) 
  12.     target_datetime = datetime.datetime.combine(target_date, target_time) 
  13.     now = datetime.datetime.now() 
  14.     delta = (target_datetime - now).total_seconds() 
  15.     time.sleep(delta) 
  16.     run() 
  17.     while True: 
  18.         time.sleep(24 * 3600) 
  19.         run() 
  20.  
  21. if __name__ == '__main__': 
  22.     schedule() 

這段程序,首先計算出現(xiàn)在距離明天早上8點相差的秒數(shù)。睡這么多秒以后,第一次運行目標(biāo)函數(shù)。然后進入一個死循環(huán),每隔86400秒,程序調(diào)用一次 run 函數(shù)。

這個程序初看起來,似乎沒有什么問題。但如果你每天觀察它的運行時間,你會發(fā)現(xiàn)隨著時間的推移,時間會越來越不準(zhǔn)確。

這是因為,run 函數(shù)不是一瞬間就運行完成的。它運行也會消耗時間。假設(shè)程序第一次運行 run 函數(shù)的時候,確實剛剛好是8:00,run 函數(shù)運行了2秒。那么,程序睡眠86400秒以后,時間實際上是8:00:02.從第二天開始,每天晚2秒鐘。一個月就會晚一分鐘。

但實際上,我們?nèi)绻冻鲆稽c點微不足道的代價,我們就可以防止這種誤差的發(fā)生,并且程序代碼會變得更簡單:

 
 
 
 
  1. import time 
  2. import datetime 
  3.  
  4.  
  5. def run(): 
  6.     print('我是需要被每天調(diào)用的函數(shù)') 
  7.  
  8. def schedule(): 
  9.     last_run = None 
  10.     while True: 
  11.         now = datetime.datetime.now() 
  12.         if now.strftime('%H:%M') == '08:00' and last_run != now.date(): 
  13.             run() 
  14.             last_run = now.date() 
  15.         time.sleep(1) 
  16.  
  17. if __name__ == '__main__': 
  18.     schedule() 

程序在一個死循環(huán)中,每秒做一次檢查,如果當(dāng)前的時分正好是08:00,并且上一次運行不是今天,那么就調(diào)用 run 函數(shù),并把上一次運行的時間設(shè)置為今天。否則,就睡眠1秒鐘。

這樣做,相當(dāng)于每秒都會校對時間,從而避免了長時間運行導(dǎo)致的時間誤差。雖然看起來這個死循環(huán)會非常消耗 CPU,但只要你算一下,實際上它只不過每天循環(huán)86400次而已。這個次數(shù)并不多。

但無論如何,專業(yè)的事情應(yīng)該交由專業(yè)的工具來做。time.sleep用來設(shè)置周期性的時間間隔可以,但它實際上不適合用來做定時任務(wù)。

因為一個支持定時任務(wù)的庫,例如 Python 的schedule或者APScheduler,他們在確保定時時間準(zhǔn)確上,做了很多工作。還有一些庫甚至用到了時間輪這樣的數(shù)據(jù)結(jié)構(gòu)來確保時間的準(zhǔn)確性。這不是我們簡單用兩三行 Python 代碼就能完成的。

總結(jié)

如果能用 crontab 或者任務(wù)計劃,那么這是最優(yōu)選擇。其次,使用 Python 專用的定時模塊。最次,才是使用 time.sleep 來實現(xiàn)。如果不得不用 time.sleep,那么應(yīng)該盡量縮短檢查的間隔,避免長時間睡眠。

本文轉(zhuǎn)載自微信公眾號「未聞Code」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系未聞Code公眾號。


文章題目:為什么不建議使用Time.Sleep實現(xiàn)定時功能?
鏈接地址:http://uogjgqi.cn/article/djdissj.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流