# 定時任務、自動化執行
###### tags: `python` `job` `scheduler`
## 準備
## 介紹
APScheduler全名為Advanced Python Schedule,是一個輕量級的Python任務定時執行模組。它可以讓你安排需要定時執行的任務,只要是可以呼叫的對象(函式、方法等等)都可以指定給定時器來執行。
#### 安裝
Python的定時器需要安裝APSchedule模組,安裝方式為:
```
# pip3 install APScheduler
```
## 說明
#### `add_job()`方法你的時間指定參數
##### `interval`模式
代表指定以間隔的方式來執行:
| 參數名稱 | 說明 |
| -------- | ---- |
|weeks|間隔幾週|
|days|間隔幾天|
|hours|間隔幾小時|
| minutes | 間隔幾分鐘 |
| seconds | 幾格幾秒 |
##### `cron`模式
指定某個時段執行:
| 參數名稱 | 說明 |
| ----------- | ------------------------------ |
|year|西元年,四位數字|
|month|月份(1-12)|
|day|日(1-31)|
|hour|時(0-23)|
|minute|分(0-59)|
| second | 秒(0-59) |
| day_of_week | 指定星期,0=星期一....6=星期日 |
## 範例
#### 阻塞式
阻塞式定時器在啟動後程式會停止繼續執行
```
import time
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
def job1():
print(f'工作1啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
def job2():
print(f'工作2啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
def job3():
print(f'工作3啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
def job4():
print(f'工作4啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
# 指定時區(一定要指定,否則會失敗)
scheduler = BlockingScheduler(timezone="Asia/Shanghai")
# 每1分鐘執行job1函式
scheduler.add_job(job1, 'interval', minutes=1)
# 每5秒執行job2函式
scheduler.add_job(job2, 'interval', seconds=5)
# 每1秒執行job3函式
scheduler.add_job(job3, 'interval', seconds=1)
# 每週二到日的下午6點30分執行job4函式
scheduler.add_job(job4, 'cron', day_of_week='1-6', hour=18, minute=30)
scheduler.start()
print('Schedule started ...') # 這行不會被執行
```
#### 非阻塞式
非阻塞式在啟動後,程式會繼續執行,需注意不能讓程式結束,否則定時器就會跟著結束了。
```
import time
from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime
def job1():
print(f'工作1啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
def job2():
print(f'工作2啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
def job3():
print(f'工作3啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
def job4():
print(f'工作4啟動: 目前時間{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
# 指定時區(一定要指定,否則會失敗)
scheduler = BackgroundScheduler(timezone="Asia/Shanghai")
# 每1分鐘執行job1函式
scheduler.add_job(job1, 'interval', minutes=1)
# 每5秒執行job2函式
scheduler.add_job(job2, 'interval', seconds=5)
# 每1秒執行job3函式
scheduler.add_job(job3, 'interval', seconds=1)
# 每週二到日的下午6點30分執行job4函式
scheduler.add_job(job4, 'cron', day_of_week='1-6', hour=18, minute=30)
scheduler.start()
print('Schedule started ...')
while True:
time.sleep(10) # 暫停10秒鐘
print('程式執行中.....')
```