APScheduler
-
- 安裝
- 功能
- 排程器scheduler
-
- BlockingScheduler
- BackgroundScheduler
- 操作排程器中的任務
- 定時控制
-
- interval 間隔
- date 定時執行一次
- cron 定時執行 (類似于linux的crontab)
安裝
pip install apscheduler
功能
用來執行定時任務
提供兩種定時方式,分别是基于固定時間的間隔,和corntab類型的任務。
排程器scheduler
APScheduler的scheduler有多種IO模型,不同的IO模型有不同的使用效果。
- BlockingScheduler:main_loop會在目前程序的主線程内運作,調用start函數後會阻塞目前線程。
- BackgroundScheduler: main_loop會在目前程序的其他線程中運作,調用start函數不會阻塞目前線程
-
QtScheduler:使用QTimer完成定時喚醒
其他幾種IO模型,我暫時用不到,日後用到再加吧。
BlockingScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
print('hello')
scheduler = BlockingScheduler()
scheduler.add_job(job, 'interval', seconds=1)
scheduler.start()
print('ok')
BackgroundScheduler
import time
from apscheduler.schedulers.background import BackgroundScheduler
def job():
print("hello")
scheduler = BackgroundScheduler()
scheduler.add_job(job, 'interval', seconds=1)
scheduler.start()
while(1):
print("ok")
time.sleep(1)
操作排程器中的任務
有了排程器之後,我們需要給排程器添加任務。
有兩種添加任務的方法,一種是add_job() 上面舉的兩個例子都是,另一種是scheduled_job修飾器
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
@scheduler.scheduled_job('interval', seconds=1)
def job():
print('hello')
scheduler.start()
删除排程器中的任務
可以在添加任務時,設定一個任務id,通過id删除任務
scheduler.add_job(job, 'interval', seconds=1, id='my_job_id')
scheduler.remove_job('my_job_id')
或者
test = scheduler.add_job(job, 'interval', seconds=1)
test.remove()
得到排程器中的任務
scheduler.get_job(job_id="my_job_id") #得到任務id為my_job_id的任務
scheduler.get_jobs() #得到所有任務
傳回結果是job的執行個體
暫停與恢複任務
暫停(重置運作時間,且暫停時不會計入時間)
scheduler.job.Job.pause()
scheduler.schedulers.base.BaseScheduler.pause_job()
恢複
scheduler.job.Job.resume()
scheduler.schedulers.base.BaseScheduler.resume_job()
關閉排程器
scheduler.shutdown() #預設情況,當所有任務完成後,關閉排程器和任務存儲
scheduler.shutdown(wait=False) #不會等待所有任務結束
定時控制
interval 間隔
scheduler.add_job(job, 'interval', seconds=1)
表示間隔一秒,調用一次job函數。
scheduler.add_job(job, 'interval', days=1, hours=11, minutes=12, seconds=1)
表示每隔1天11小時12分鐘1秒,調用一次job函數
date 定時執行一次
scheduler.add_job(job, 'date',run_date="2019-03-29 20:00:00")
這裡可以用datetime子產品,更容易書寫
scheduler.add_job(job, 'date',run_date=datetime.datetime(2019,3,29,20,0,0))
scheduler.add_job(job, 'date',run_date=datetime.date(2019,3,29))
用date模式有個奇怪的地方,程序會卡死,隻能用kill指令殺死程序,應該是使用了多線程引起的。
cron 定時執行 (類似于linux的crontab)
scheduler.add_job(job, 'cron', hour='10', minute='30', second='30') #表示每天10:30:30執行一次job函數
參數說明如下
引用了别人的代碼:
#表示2017年3月22日17時19分07秒執行該程式
sched.add_job(my_job, 'cron', year=2017,month = 03,day = 22,hour = 17,minute = 19,second = 07)
#表示任務在6,7,8,11,12月份的第三個星期五的00:00,01:00,02:00,03:00 執行該程式
sched.add_job(my_job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
#表示從星期一到星期五5:30(AM)直到2014-05-30 00:00:00
sched.add_job(my_job(), 'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2014-05-30')
#表示每5秒執行該程式一次,相當于interval 間隔排程中seconds = 5
sched.add_job(my_job, 'cron',second = '*/5')