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