定時任務框架APScheduler學習詳解
APScheduler簡介
在平常的工作中幾乎有一半的功能模組都需要定時任務來推動,例如專案中有一個定時統計程式,定時爬出網站的URL程式,定時檢測釣魚網站的程式等等,都涉及到了關於定時任務的問題,第一時間想到的是利用time模組的time.sleep()方法使程式休眠來達到定時任務的目的,雖然這樣也可以,但是總覺得不是那麼的專業,^_^所以就找到了python的定時任務模組APScheduler:
APScheduler基於Quartz的一個Python定時任務框架,實現了Quartz的所有功能,使用起來十分方便。提供了基於日期、固定時間間隔以及crontab型別的任務,並且可以持久化任務。基於這些功能,我們可以很方便的實現一個python定時任務系統
安裝
1、利用pip進行安裝
1 |
$ pip install apscheduler
|
2、原始碼安裝(https://pypi.python.org/pypi/APScheduler/)
1 |
$ python setup.py install
|
APScheduler有四種組成部分:
觸發器(trigger)包含排程邏輯,每一個作業有它自己的觸發器,用於決定接下來哪一個作業會執行。除了他們自己初始配置意外,觸發器完全是無狀態的。
作業儲存(job store)儲存被排程的作業,預設的作業儲存是簡單地把作業儲存在記憶體中,其他的作業儲存是將作業儲存在資料庫中。一個作業的資料講在儲存在持久化作業儲存時被序列化,並在載入時被反序列化。排程器不能分享同一個作業儲存。
執行器(executor)處理作業的執行,他們通常通過在作業中提交制定的可呼叫物件到一個執行緒或者進城池來進行。當作業完成時,執行器將會通知排程器。
排程器(scheduler)是其他的組成部分。你通常在應用只有一個排程器,應用的開發者通常不會直接處理作業儲存、排程器和觸發器,相反,排程器提供了處理這些的合適的介面。配置作業儲存和執行器可以在排程器中完成,例如新增、修改和移除作業。
簡單應用:
1 2 3 4 5 6 7 8 9 |
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()修飾器來修飾函式
1 2 3 4 5 6 7 8 9 10 |
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. 移除作業
1 2 3 4 5 |
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. 暫停和恢復作業
暫停作業:
1 2 |
apsched.job.Job.pause()
apsched.schedulers.base.BaseScheduler.pause_job()
|
恢復作業:
1 2 |
apsched.job.Job.resume()
apsched.schedulers.base.BaseScheduler.resume_job()
|
4. 獲得job列表
獲得排程作業的列表,可以使用get_jobs()
來完成,它會返回所有的job例項。或者使用print_jobs()
來輸出所有格式化的作業列表。也可以利用get_job(任務ID)獲取指定任務的作業列表
1 2 3 |
job = sched.add_job(my_job, 'interval' , seconds = 2 , id = '123' )
print sched.get_job(job_id = '123' )
print sched.get_jobs()
|
5. 關閉排程器
預設情況下排程器會等待所有正在執行的作業完成後,關閉所有的排程器和作業儲存。如果你不想等待,可以將wait選項設定為False。
1 2 |
sched.shutdown()
sched.shutdown(wait = False )
|
作業執行的控制(trigger)
add_job的第二個引數是trigger,它管理著作業的排程方式。它可以為date, interval或者cron。對於不同的trigger,對應的引數也相同。
(1). cron定時排程(某一定時時刻執行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
( int | str ) 表示引數既可以是 int 型別,也可以是 str 型別
(datetime | str ) 表示引數既可以是datetime型別,也可以是 str 型別
year ( int | str ) – 4 - digit year - (表示四位數的年份,如 2008 年)
month ( int | str ) – month ( 1 - 12 ) - (表示取值範圍為 1 - 12 月)
day ( int | str ) – day of the ( 1 - 31 ) - (表示取值範圍為 1 - 31 日)
week ( int | str ) – ISO week ( 1 - 53 ) - (格里曆 2006 年 12 月 31 日可以寫成 2006 年 - W52 - 7 (擴充套件形式)或 2006W527 (緊湊形式))
day_of_week ( int | str ) – number or name of weekday ( 0 - 6 or mon,tue,wed,thu,fri,sat,sun) - (表示一週中的第幾天,既可以用 0 - 6 表示也可以用其英語縮寫表示)
hour ( int | str ) – hour ( 0 - 23 ) - (表示取值範圍為 0 - 23 時)
minute ( int | str ) – minute ( 0 - 59 ) - (表示取值範圍為 0 - 59 分)
second ( int | str ) – second ( 0 - 59 ) - (表示取值範圍為 0 - 59 秒)
start_date (datetime| str ) – earliest possible date / time to trigger on (inclusive) - (表示開始時間)
end_date (datetime| str ) – latest possible date / time to trigger on (inclusive) - (表示結束時間)
timezone (datetime.tzinfo| str ) – time zone to use for the date / time calculations (defaults to scheduler timezone) - (表示時區取值)
|
引數的取值格式:
例子:
1 2 3 4 5 6 7 8 9 10 11 |
#表示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' )
|
(2). interval 間隔排程(每隔多久執行)
1 2 3 4 5 6 7 8 |
weeks ( int ) – number of weeks to wait
days ( int ) – number of days to wait
hours ( int ) – number of hours to wait
minutes ( int ) – number of minutes to wait
seconds ( int ) – number of seconds to wait
start_date (datetime| str ) – starting point for the interval calculation
end_date (datetime| str ) – latest possible date / time to trigger on
timezone (datetime.tzinfo| str ) – time zone to use for the date / time calculations
|
例子:
1 2 |
#表示每隔3天17時19分07秒執行一次任務
sched.add_job(my_job, 'interval' ,days = 03 ,hours = 17 ,minutes = 19 ,seconds = 07 )
|
(3). date 定時排程(作業只會執行一次)
1 2 |
run_date (datetime| str ) – the date / time to run the job at - (任務開始的時間)
timezone (datetime.tzinfo| str ) – time zone for run_date if it doesn’t have one already
|
例子:
1 2 3 4 |
# The job will be executed on November 6th, 2009
sched.add_job(my_job, 'date' , run_date = date( 2009 , 11 , 6 ), args = [ 'text' ])
# The job will be executed on November 6th, 2009 at 16:30:05
sched.add_job(my_job, 'date' , run_date = datetime( 2009 , 11 , 6 , 16 , 30 , 5 ), args = [ 'text' ])
|