天天看點

python定時子產品APScheduler

APScheduler

    • 安裝
    • 功能
    • 排程器scheduler
      • BlockingScheduler
      • BackgroundScheduler
    • 操作排程器中的任務
    • 定時控制
      • interval 間隔
      • date 定時執行一次
      • cron 定時執行 (類似于linux的crontab)

安裝

pip install apscheduler
           

功能

用來執行定時任務

提供兩種定時方式,分别是基于固定時間的間隔,和corntab類型的任務。

排程器scheduler

APScheduler的scheduler有多種IO模型,不同的IO模型有不同的使用效果。

  1. BlockingScheduler:main_loop會在目前程序的主線程内運作,調用start函數後會阻塞目前線程。
  2. BackgroundScheduler: main_loop會在目前程序的其他線程中運作,調用start函數不會阻塞目前線程
  3. 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函數
           

參數說明如下

python定時子產品APScheduler

引用了别人的代碼:

#表示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')