<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
pip install apscheduler
triggers:觸發器
triggers包含任務執行的排程邏輯,決定任務按照什麼邏輯進行定時執行
job stores;任務記憶體
儲存了排程任務
executors:執行器
用例執行任務的,包含執行緒池以及程序池等的建立和呼叫等等
schedulers:排程器
屬於控制面,將其他幾個方面組織起來的作用、
排程器有以下幾種常見型別,其中最常用的BackgroundScheduler,即非阻塞式,因為在一般情況下,定時任務都會在放到web服務中,如果使用阻塞式,則無法啟動web服務,而使用非阻塞式,則將定時任務設定後,就不管了,繼續執行後面的web服務,只要web服務在執行,定時任務就是一直有效的
這裡jiu就以非阻塞式BackgroundScheduler排程器為例展開
如下,使用了三種設定日期和時間的方法
from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 通過date 設定指定日期執行 sched.add_job(do_func,trigger="date",run_date=date(2022,5,25),args=("張三丰",100)) # 通過datetime,設定指定日期額指定時刻執行 sched.add_job(do_func, trigger="date", run_date=datetime(2022, 5, 25,14,0,10), args=("張三丰", 100)) # 直接使用文字的方式指定日期和時刻表 sched.add_job(do_func, trigger="date", run_date="2022-05-25 14:0:20", args=("張三丰", 100)) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
執行結果如下,可以發現,第一個通過date指定日期的預設是0點執行,顯然時間已經過了,不會執行,第二和第三個則在規定的時間點執行了,這裡還需要注意的是,通過列印可以看出,main函數執行完成後,已經開始執行main函數下面的while迴圈列印語句了,而在執行迴圈的過程中,定時任務仍然生效,這就是非阻塞式排程器的原理,如果是阻塞式,則在此程式碼中,會一直卡在main函數中,main下面額while迴圈語句是不會執行的,因此在實際使用中,非阻塞式應用的是非常多的
2022-05-25 14:00:02
2022-05-25 14:00:02
C:Usershitre.virtualenvszentaolinkgitlab-QCS5yxD9libsite-packagesapschedulerutil.py:436: PytzUsageWarning: The localize method is no longer necessary, as this time zone supports the fold attribute (PEP 495). For more details on migrating to a PEP 495-compliant implementation, see https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html
return tzinfo.localize(dt)
Run time of job "do_func (trigger: date[2022-05-25 00:00:00 CST], next run at: 2022-05-25 00:00:00 CST)" was missed by 14:00:02.088260
2022-05-25 14:00:03
2022-05-25 14:00:04
2022-05-25 14:00:05
2022-05-25 14:00:06
2022-05-25 14:00:07
2022-05-25 14:00:08
2022-05-25 14:00:09
2022-05-25 14:00:10 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:00:10
2022-05-25 14:00:11
2022-05-25 14:00:12
2022-05-25 14:00:13
2022-05-25 14:00:14
2022-05-25 14:00:15
2022-05-25 14:00:16
2022-05-25 14:00:17
2022-05-25 14:00:18
2022-05-25 14:00:19
2022-05-25 14:00:20 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:00:20
2022-05-25 14:00:21
2022-05-25 14:00:22
如下程式碼演示了時間間隔迴圈執行的使用例子
from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 每3秒執行一次 sched.add_job(do_func,trigger="interval",args=("張三丰",100),seconds=3) # 每3分鐘執行一次 sched.add_job(do_func, trigger="interval", args=("張三丰", 100), minutes=3) # 每3小時執行一次 sched.add_job(do_func, trigger="interval", args=("張三丰", 100), hours=3) # 每3天執行一次 sched.add_job(do_func, trigger="interval", args=("張三丰", 100), days=3) # 每3周執行一次 sched.add_job(do_func, trigger="interval", args=("張三丰", 100), weeks=3) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
上面的程式碼中因為時間跨度比較大,這裡只演示妹3秒執行一次的程式碼
程式碼如下:
from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 每3秒執行一次 sched.add_job(do_func,trigger="interval",args=("張三丰",100),seconds=3) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
執行結果如下:
2022-05-25 14:14:04
2022-05-25 14:14:04
2022-05-25 14:14:05
2022-05-25 14:14:06
2022-05-25 14:14:07 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:14:07
2022-05-25 14:14:08
2022-05-25 14:14:09
2022-05-25 14:14:10 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:14:10
2022-05-25 14:14:11
2022-05-25 14:14:12
2022-05-25 14:14:13 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:14:13
cron的觸發器有點類似linux上crontab定時器的使用,程式碼如下:
from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 任務會在6月、7月、8月、11月和12月的第三個週五,00:00、01:00、02:00和03:00觸發 sched.add_job(do_func,trigger="cron",month='6-8,11-12', day='3rd fri', hour='0-3',args=("張三丰",100)) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
這裡需要注意的是,可以省略不需要的欄位。當省略時間引數時,在顯式指定引數之前的引數會被設定為*,之後的引數會被設定為最小值,week 和day_of_week的最小值為*
day=1, minute=20 等同於 year='*', month='*', day=1, week='*', day_of_week='*', hour='*', minute=20, second=0
此外,也可以直接使用crontab表示式,如下:
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 任務會在6月、7月、8月、11月和12月的第三個週五,00:00、01:00、02:00和03:00觸發 sched.add_job(do_func,trigger=CronTrigger.from_crontab('48 10 1-15 sep-nov *'),args=("張三丰",100)) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
以間隔時間迴圈執行的程式碼為例,如下為未使用裝飾器的方式
from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 每3秒執行一次 sched.add_job(do_func,trigger="interval",args=("張三丰",100),seconds=3) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
修改為使用裝飾器的方式如下:
from apscheduler.schedulers.background import BackgroundScheduler import time sched=BackgroundScheduler() @sched.scheduled_job(trigger="interval",args=("張三丰",100),seconds=3) def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年齡:"+str(age)) if __name__=="__main__": sched.start() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1)
執行結果如下:
2022-05-25 14:34:10
2022-05-25 14:34:11
2022-05-25 14:34:12
2022-05-25 14:34:13 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:34:13
2022-05-25 14:34:14
2022-05-25 14:34:15
2022-05-25 14:34:16 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:34:16
2022-05-25 14:34:17
2022-05-25 14:34:18
2022-05-25 14:34:19 in do func : 姓名:張三丰 年齡:100
2022-05-25 14:34:19
2022-05-25 14:34:20
到此這篇關於Python使用apscheduler模組設定定時任務的實現的文章就介紹到這了,更多相關Python apscheduler定時任務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45