背影
由于程序需求,監(jiān)測配置變化需要設(shè)置定時任務(wù),每分鐘執(zhí)行一次,對任務(wù)持久化要求不高,不需要時可以關(guān)閉定時任務(wù)
定時任務(wù)庫對比
根據(jù)上面需求,我找到幾個庫來實現(xiàn)
schedule:Python job scheduling for humans. 輕量級,無需配置的作業(yè)調(diào)度庫
Apscheduler:一個高級的 Python 任務(wù)調(diào)度庫
Celery:是一個簡單,靈活,可靠的分布式系統(tǒng),用于處理大量消息,同時為操作提供維護(hù)此類系統(tǒng)所需的工具, 也可用于任務(wù)調(diào)度
基于我們的需求,我們只需要輕量級的庫就可以,我們選用schedule庫
直接使用 pip install schedule
進(jìn)行安裝使用
import schedule
import time
# 定義你要周期運行的函數(shù)
def job():
print("I'm working...")
schedule.every(10).minutes.do(job) # 每隔 10 分鐘運行一次 job 函數(shù)
schedule.every().hour.do(job) # 每隔 1 小時運行一次 job 函數(shù)
schedule.every().day.at("10:30").do(job) # 每天在 10:30 時間點運行 job 函數(shù)
schedule.every().monday.do(job) # 每周一 運行一次 job 函數(shù)
schedule.every().wednesday.at("13:15").do(job) # 每周三 13:15 時間點運行 job 函數(shù)
schedule.every().minute.at(":17").do(job) # 每分鐘的 17 秒時間點運行 job 函數(shù)
while True:
schedule.run_pending() # 運行所有可以運行的任務(wù)
time.sleep(1)
上述是簡單的使用示例,我們需求定時分鐘級就用schedule.every(1).minutes.do(job) 就可以,但是定時任務(wù)執(zhí)行后會占用線程,那么運行后我們的程序會卡,schedule 是阻塞式的,默認(rèn)情況下, schedule 按順序執(zhí)行所有的作業(yè),不能達(dá)到并行執(zhí)行任務(wù),我們使用多線程來解決。
可看到有三個類CancelJob、Scheduler、Job
CancelJob
class CancelJob(object):
pass
可以看到這是一個空類,這個類的作用是當(dāng)job執(zhí)行函數(shù)返回一個CancelJob類型的對象時,執(zhí)行完之后就會被Schedule移除,簡單說就是只會執(zhí)行一次。
其它源碼可以自行查看學(xué)習(xí)。
items =schedule.get_jobs() #調(diào)用這個可以顯示所有定時任務(wù),括號內(nèi)可以加特定的tag,只顯示特定的任務(wù)
print(items)
for item in items:
item=str(item)
self.tree1.insert('',0,values=[item])
我們使用這個來作為任務(wù)管理界面顯示所有定時任務(wù)。
那么定時任務(wù)怎么取消呢?
# 通過 tag 函數(shù)給它們添加唯一標(biāo)識符進(jìn)行分組,取消時通過標(biāo)識符進(jìn)行取消相應(yīng)組的任務(wù)
def greet(name):
print('Hello {}'.format(name))
schedule.every().day.do(greet, 'Andrea').tag('daily-tasks', 'friend')
schedule.every().hour.do(greet, 'John').tag('hourly-tasks', 'friend')
schedule.every().hour.do(greet, 'Monica').tag('hourly-tasks', 'customer')
schedule.every().day.do(greet, 'Derek').tag('daily-tasks', 'guest')
schedule.clear('daily-tasks')
schedule取消定時任務(wù),通過tag來進(jìn)行標(biāo)識,這樣就能實現(xiàn)簡單的定時任務(wù)管理與刪除。
其實我們也可以使用循環(huán)來實現(xiàn)重復(fù)執(zhí)行函數(shù)加上time.sleep()來實現(xiàn)定時執(zhí)行,循環(huán)里加個條件,滿足條件就break跳出,這樣也能實現(xiàn)定時暫停。
-
定時器
+關(guān)注
關(guān)注
23文章
3288瀏覽量
117272 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86229
發(fā)布評論請先 登錄
關(guān)于stm32系統(tǒng)定時任務(wù)的問題
Linux系統(tǒng)定時任務(wù)Crond
ucos iii定時任務(wù)有什么用?
定時任務(wù)的發(fā)展史是怎么樣的

SpringBoot如何實現(xiàn)動態(tài)增刪啟停定時任務(wù)

Python定時任務(wù)的實現(xiàn)方式
解析Golang定時任務(wù)庫gron設(shè)計和原理
求一種SpringBoot定時任務(wù)動態(tài)管理通用解決方案
Spring Boot中整合兩種定時任務(wù)的方法

評論