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'
])
|