關(guān)于python定時器的一些思路分享
定時器大家肯定都不陌生
就是讓代碼在指定時間去執(zhí)行任務(wù)
那假如讓你設(shè)計一個定時器
你會怎么寫呢
是不是這樣

這個代碼很簡單
就是死循環(huán)每次休眠1s
然后每次都獲取當(dāng)前時間
跟指定時間做比較
相同就執(zhí)行任務(wù)
這里是每次休眠1s
如果你想只精確到分
那你可以延長休眠時間
然后修改獲取本地時間的格式

這樣即可
然后每次可以休眠長一點
例如30s,或者60s以內(nèi)
這樣做確實沒問題
但,
你有沒有覺得有點麻煩

而且這是在考慮代碼的延遲基本為0的情況
如果你要精確到秒
那么是不是可能會出現(xiàn)一點點偏差
有這個可能性,但不大
主要問題在哪里
這個死循環(huán)
著實看起來不是那么漂亮
又或者
假如我規(guī)定只需要工作日執(zhí)行
或者只要哪個時間段執(zhí)行
或者我規(guī)定多少時間執(zhí)行一次
那這個邏輯是不是就麻煩了許多

因為最近項目需求
我也感覺到了這種方法的繁瑣
于是就在尋找
有沒有這樣一種框架
可以異步定時執(zhí)行任務(wù)
而且邏輯簡單
功夫不負(fù)有心人
我覺得這個是肯定存在的
不可能不存在這個東西
于是乎,
這個出現(xiàn)了
apscheduler

apscheduler的簡單介紹

總之就是
比較nice
安裝方式:
pip install apscheduler
然后過多的操作我也不多說了
隨便搜兩篇帖子就看懂了
簡單介紹幾種方式

直接看圖片即可
很簡單
有三種方式
date,cron,interval
指定日期時間執(zhí)行一次
指定時間每天執(zhí)行
間隔時間執(zhí)行
更多說明可以看官方文檔
https://apscheduler.readthedocs.io/en/stable/
還可以指定工作日,開始時間,結(jié)束時間,指定日期等等
反正我用了是感覺非常方便
但
有一個大問題
如果就按照我剛才這樣寫
你會發(fā)現(xiàn)
假如你下面還有代碼
像這樣

你會發(fā)現(xiàn)
這下面的是不會執(zhí)行的
運(yùn)行結(jié)果是這樣

原因就是
他是堵塞的
!
很明顯
這不是我們想要的結(jié)果
所以
這里就要用異步的寫法
把他放到一個線程里面去
像這樣

那么
就不會阻塞了
運(yùn)行結(jié)果是這樣

第一次有4個1是因為第一個1沒有休眠
這就看得到效果了
如果用效果更明顯的操作
那就是
在要執(zhí)行的任務(wù)里面加休眠
像這樣

很明顯
這個休眠是異步的
任務(wù)里面的休眠
并不會影響你外面函數(shù)的正常運(yùn)行
這個提示是因為

基本上就是,你休眠的時候
定時任務(wù)任然在執(zhí)行
而當(dāng)前函數(shù)又還沒執(zhí)行完
產(chǎn)生的沖突
有解決辦法,也比較簡單
而且這應(yīng)該是只在interval才會出現(xiàn)的問題
在date和cron這兩種不會出現(xiàn)
好了
更多說明和樣例請自行百度吧
網(wǎng)上博客很多
說的更詳細(xì)
反正用起來
比較簡單
也很方便
趕快試試吧~
如果還有問題
可以進(jìn)讀者群
一起討論哈哈哈

感謝閱讀~
歡迎關(guān)注公眾號:SKpython
-End-
