APScheduler簡介
在平常的工作中幾乎有一半的功能模塊都需要定時任務來推動,例如項目中有一個定時統計程序,定時爬出網站的URL程序,定時檢測釣魚網站的程序等等,都涉及到了關於定時任務的問題,第一時間想到的是利用time模塊的time.sleep()方法使程序休眠來達到定時任務的目的,雖然這樣也可以,但是總覺得不是那麼的專業,^_^所以就找到了python的定時任務模塊APScheduler:
APScheduler基於Quartz的一個Python定時任務框架,實現了Quartz的所有功能,使用起來十分方便。提供了基於日期、固定時間間隔以及crontab類型的任務,並且可以持久化任務。基於這些功能,我們可以很方便的實現一個python定時任務系統。
安裝
1、利用pip進行安裝
pip install apscheduler
2、源碼安裝(https://pypi.python.org/pypi/APScheduler/)
APScheduler有四種組成部分:
觸發器(trigger)包含調度邏輯,每一個作業有它自己的觸發器,用於決定接下來哪一個作業會運行。除了他們自己初始配置意外,觸發器完全是無狀態的。
作業存儲(job store)存儲被調度的作業,默認的作業存儲是簡單地把作業保存在內存中,其他的作業存儲是將作業保存在數據庫中。一個作業的數據講在保存在持久化作業存儲時被序列化,並在加載時被反序列化。調度器不能分享同一個作業存儲。
執行器(executor)處理作業的運行,他們通常通過在作業中提交制定的可調用對象到一個線程或者進城池來進行。當作業完成時,執行器將會通知調度器。
調度器(scheduler)是其他的組成部分。你通常在應用只有一個調度器,應用的開發者通常不會直接處理作業存儲、調度器和觸發器,相反,調度器提供了處理這些的合適的接口。配置作業存儲和執行器可以在調度器中完成,例如添加、修改和移除作業。
簡單應用:
import time
from apscheduler.schedulers.blocking import BlockingScheduler
def my_job():
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
sched = BlockingScheduler()
sched.add_job(my_job, 'interval', seconds=5)
sched.start()
操作作業上面的例子表示每隔5s執行一次my_job函數,輸出當前時間信息
1. 添加作業
上面是通過add_job()來添加作業,另外還有一種方式是通過scheduled_job()修飾器來修飾函數
import time
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', seconds=5)
def my_job():
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
sched.start()
2. 移除作業
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()
#如果有多個任務序列的話可以給每個任務設置ID號,可以根據ID號選擇清除對象,且remove放到start前纔有效
sched.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
sched.remove_job('my_job_id')
3. 暫停和恢復作業
暫停作業:
apsched.job.Job.pause()
apsched.schedulers.base.BaseScheduler.pause_job()
恢復作業:
4. 獲得job列表
獲得調度作業的列表,可以使用get_jobs()
來完成,它會返回所有的job實例。或者使用print_jobs()
來輸出所有格式化的作業列表。也可以利用get_job(任務ID)獲取指定任務的作業列表
job = sched.add_job(my_job, 'interval', seconds=2 ,id='123')
print sched.get_job(job_id='123')
print sched.get_jobs()
默認情況下調度器會等待所有正在運行的作業完成後,關閉所有的調度器和作業存儲。如果你不想等待,可以將wait選項設置爲False。5. 關閉調度器
sched.shutdown()
sched.shutdown(wait=False)
add_job的第二個參數是trigger,它管理着作業的調度方式。它可以爲date, interval或者cron。對於不同的trigger,對應的參數也相同。 作業運行的控制(trigger)
(1). cron定時調度(某一定時時刻執行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
參數的取值格式:
例子:
1 2 3 4 5 6 7 8 9 10 11 |
|
(2). interval 間隔調度(每隔多久執行)
1 2 3 4 5 6 7 8 |
|
例子:
1 2 |
|
(3). date 定時調度(作業只會執行一次)
1 2 |
|
例子:
1 2 3 4 |
|