成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么不建議使用 Time.Sleep 實現定時功能?

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

[[359157]]

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

可能有同學會這樣寫代碼:

  1. import time 
  2. import datetime 
  3.  
  4.  
  5. def run(): 
  6.     print('我是需要被每天調用的函數'
  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() 

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

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

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

但實際上,我們如果付出一點點微不足道的代價,我們就可以防止這種誤差的發生,并且程序代碼會變得更簡單:

  1. import time 
  2. import datetime 
  3.  
  4.  
  5. def run(): 
  6.     print('我是需要被每天調用的函數'
  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() 

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

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

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

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

總結

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

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2024-03-11 11:02:03

Date類JavaAPI

2020-12-15 10:00:31

MySQL數據庫text

2020-11-01 17:11:51

time.sleep暫停代碼Python

2020-11-17 09:01:09

MySQLDelete數據

2021-11-15 06:56:45

MyBatis開發項目

2024-07-29 08:20:10

2021-08-04 17:20:30

阿里巴巴AsyncJava

2021-10-13 14:06:46

MySQLUtf8符號

2020-12-24 18:46:11

Java序列化編程語言

2020-04-01 17:50:02

Python編程語言

2020-06-23 14:09:49

枚舉JDK場景

2024-02-28 07:37:53

JavaExecutors工具

2022-02-06 10:58:37

Redis主從模式

2021-07-01 16:10:22

equals字符串Java

2021-01-26 21:00:24

SSL證書網絡安全加密

2021-03-10 09:40:50

Linux命令文件

2023-09-21 10:50:23

MySQL數據庫

2021-11-05 07:18:15

分布式事務業務

2021-10-13 06:49:13

Integer 阿里巴巴包裝類

2024-04-24 12:45:06

index性能數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕欧美一区 | 亚洲一区二区 | 精品国产乱码久久久久久a丨 | 国产日韩免费视频 | 日韩欧美国产精品一区二区 | 亚洲激情在线 | 亚洲一区二区在线电影 | 日韩一区二区三区视频在线观看 | 91精品国产综合久久久久久蜜臀 | 在线成人免费视频 | 国产精品女人久久久 | 国产美女黄色片 | 日韩成人在线一区 | 久久久久国产精品一区二区 | 亚洲精品免费看 | 成人在线中文字幕 | 久久精品亚洲精品国产欧美 | 久久国产综合 | 国产农村妇女毛片精品久久麻豆 | 中文字幕免费观看 | 在线成人 | 欧美高清成人 | 亚洲国产精品久久久久久 | 久久久久久久一区二区三区 | 亚洲一区二区三区欧美 | 日韩视频中文字幕 | 欧美极品一区二区 | 日韩高清中文字幕 | 国产精品久久久久久久久久久久久 | 黄色在线免费观看 | 欧美日一区二区 | 欧美精品一区二区三区在线播放 | 久草热在线 | 国产一区二区在线免费观看 | 色久电影 | 国产精品久久久久久久久 | 日日干干| 少妇精品亚洲一区二区成人 | 久久手机视频 | 91在线观看免费视频 | 日本黄色高清视频 |