# 定時任務、自動化執行 ###### 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('程式執行中.....') ```