背影
由于程序需求,監(jiān)測(cè)配置變化需要設(shè)置定時(shí)任務(wù),每分鐘執(zhí)行一次,對(duì)任務(wù)持久化要求不高,不需要時(shí)可以關(guān)閉定時(shí)任務(wù)
定時(shí)任務(wù)庫(kù)對(duì)比
根據(jù)上面需求,我找到幾個(gè)庫(kù)來實(shí)現(xiàn)
schedule:Python job scheduling for humans. 輕量級(jí),無需配置的作業(yè)調(diào)度庫(kù)
Apscheduler:一個(gè)高級(jí)的 Python 任務(wù)調(diào)度庫(kù)
Celery:是一個(gè)簡(jiǎn)單,靈活,可靠的分布式系統(tǒng),用于處理大量消息,同時(shí)為操作提供維護(hù)此類系統(tǒng)所需的工具, 也可用于任務(wù)調(diào)度
基于我們的需求,我們只需要輕量級(jí)的庫(kù)就可以,我們選用schedule庫(kù)
直接使用 pip install schedule
進(jìn)行安裝使用
import schedule
import time
# 定義你要周期運(yùn)行的函數(shù)
def job():
print("I'm working...")
schedule.every(10).minutes.do(job) # 每隔 10 分鐘運(yùn)行一次 job 函數(shù)
schedule.every().hour.do(job) # 每隔 1 小時(shí)運(yùn)行一次 job 函數(shù)
schedule.every().day.at("10:30").do(job) # 每天在 10:30 時(shí)間點(diǎn)運(yùn)行 job 函數(shù)
schedule.every().monday.do(job) # 每周一 運(yùn)行一次 job 函數(shù)
schedule.every().wednesday.at("13:15").do(job) # 每周三 13:15 時(shí)間點(diǎn)運(yùn)行 job 函數(shù)
schedule.every().minute.at(":17").do(job) # 每分鐘的 17 秒時(shí)間點(diǎn)運(yùn)行 job 函數(shù)
while True:
schedule.run_pending() # 運(yùn)行所有可以運(yùn)行的任務(wù)
time.sleep(1)
上述是簡(jiǎn)單的使用示例,我們需求定時(shí)分鐘級(jí)就用schedule.every(1).minutes.do(job) 就可以,但是定時(shí)任務(wù)執(zhí)行后會(huì)占用線程,那么運(yùn)行后我們的程序會(huì)卡,schedule 是阻塞式的,默認(rèn)情況下, schedule 按順序執(zhí)行所有的作業(yè),不能達(dá)到并行執(zhí)行任務(wù),我們使用多線程來解決。
可看到有三個(gè)類CancelJob、Scheduler、Job
CancelJob
class CancelJob(object):
pass
可以看到這是一個(gè)空類,這個(gè)類的作用是當(dāng)job執(zhí)行函數(shù)返回一個(gè)CancelJob類型的對(duì)象時(shí),執(zhí)行完之后就會(huì)被Schedule移除,簡(jiǎn)單說就是只會(huì)執(zhí)行一次。
其它源碼可以自行查看學(xué)習(xí)。
items =schedule.get_jobs() #調(diào)用這個(gè)可以顯示所有定時(shí)任務(wù),括號(hào)內(nèi)可以加特定的tag,只顯示特定的任務(wù)
print(items)
for item in items:
item=str(item)
self.tree1.insert('',0,values=[item])
我們使用這個(gè)來作為任務(wù)管理界面顯示所有定時(shí)任務(wù)。
那么定時(shí)任務(wù)怎么取消呢?
# 通過 tag 函數(shù)給它們添加唯一標(biāo)識(shí)符進(jìn)行分組,取消時(shí)通過標(biāo)識(shí)符進(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取消定時(shí)任務(wù),通過tag來進(jìn)行標(biāo)識(shí),這樣就能實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)管理與刪除。
其實(shí)我們也可以使用循環(huán)來實(shí)現(xiàn)重復(fù)執(zhí)行函數(shù)加上time.sleep()來實(shí)現(xiàn)定時(shí)執(zhí)行,循環(huán)里加個(gè)條件,滿足條件就break跳出,這樣也能實(shí)現(xiàn)定時(shí)暫停。
-
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115387 -
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85040
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
關(guān)于stm32系統(tǒng)定時(shí)任務(wù)的問題
Linux系統(tǒng)定時(shí)任務(wù)Crond
ucos iii定時(shí)任務(wù)有什么用?
定時(shí)任務(wù)的發(fā)展史是怎么樣的
![<b class='flag-5'>定時(shí)任務(wù)</b>的發(fā)展史是怎么樣的](https://file.elecfans.com/web1/M00/9C/EC/o4YBAF0wDnqAcdbUAAEOnnfW4ho786.png)
SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)
![SpringBoot如何實(shí)現(xiàn)動(dòng)態(tài)增刪啟停<b class='flag-5'>定時(shí)任務(wù)</b>](https://file.elecfans.com/web2/M00/15/BE/poYBAGFNMLeAVLe-AAAHghOb210341.jpg)
Python定時(shí)任務(wù)的實(shí)現(xiàn)方式
解析Golang定時(shí)任務(wù)庫(kù)gron設(shè)計(jì)和原理
求一種SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案
Spring Boot中整合兩種定時(shí)任務(wù)的方法
![Spring Boot中整合兩種<b class='flag-5'>定時(shí)任務(wù)</b>的方法](https://file1.elecfans.com/web2/M00/81/FF/wKgZomQvvfaABG6GAABuBEBmiJI154.jpg)
在Spring Boot中如何使用定時(shí)任務(wù)
如何動(dòng)態(tài)添加修改刪除定時(shí)任務(wù)?
Linux如何使用cron進(jìn)行定時(shí)任務(wù)的操作
定時(shí)器如何實(shí)現(xiàn)定時(shí)任務(wù)
linux定時(shí)任務(wù)的用法總結(jié)
![linux<b class='flag-5'>定時(shí)任務(wù)</b>的用法總結(jié)](https://file1.elecfans.com/web2/M00/03/80/wKgaoma8hC6AWmDxAABM_AijTcU560.png)
評(píng)論