有時候,我們想讓程序在某個特定時間段內去多次執行某個任務,比如每天凌晨3點-4點,隔10秒執行一次任務,接下來,我們就用python自帶的datetime模塊和threading模塊去實現它,代碼如下:
import datetime import threading #任務描述:每天凌晨3-4點,隔10秒執行一次task任務 def func1(): '''凌晨3點開啟任務''' func2() #如果需要每天都執行,加上下面兩句 t = threading.Timer(86400,func1) t.start() def func2(): '''3點-4點,隔10秒執行一次任務task''' task() # 凌晨4點函數結束執行 now_time = datetime.datetime.now() today_4 = datetime.datetime.strptime(str(datetime.datetime.now().year)+'-'+str(datetime.datetime.now().month)+'-'+str(datetime.datetime.now().day)+' '+'04:00:00','%Y-%m-%d %H:%M:%S') #因為定時任務會延后10秒鍾執行,所以設置終止條件時,需要提前10秒鍾 if now_time <= today_4-datetime.timedelta(seconds=10): t = threading.Timer(10, func2) t.start() def task(): '''需要執行的任務''' print('task任務開始執行') print('task任務執行完畢') def main(): #獲取當前時間 now_time = datetime.datetime.now() #獲取當前時間年、月、日 now_year = now_time.year now_month = now_time.month now_day = now_time.day #今天凌晨3點時間表示 today_3 = datetime.datetime.strptime(str(now_year)+'-'+str(now_month)+'-'+str(now_day)+' '+'03:00:00','%Y-%m-%d %H:%M:%S') #明天凌晨3點時間表示 tomorrow_3 = datetime.datetime.strptime(str(now_year)+'-'+str(now_month)+'-'+str(now_day)+' '+'03:00:00','%Y-%m-%d %H:%M:%S') #判斷當前時間是否過了今天凌晨3點,如果沒過,則今天凌晨3點開始執行,過了則從明天凌晨3點開始執行,計算程序等待執行的時間 if now_time <= today_3: wait_time = (today_3 - now_time).total_seconds() else: wait_time = (tomorrow_3 - now_time).total_seconds() #等待wait_time秒后(今天凌晨3點或明天凌晨3點),開啟線程去執行func函數 t = threading.Timer(wait_time,func1) t.start() if __name__ == '__main__': main()
如果想讓程序更通用,可以將上述方法封裝成一個定時器類,進行參數化