更多內容,請訪問個人 我的博客。python
談到定時任務,你們可能會優先想到 linux 中的 crontab
,或者 windows 中的任務計劃。這些工具用起來都很方便,可是說出來你可能不信,最近我在生信流程中使用 crontab
命令完成一些自動化操做時,遇到問題了。linux
不知是否是 crontab
命令不容許有 qsub 的提交操做,仍是管理員設置了 crontab
發起任務的用戶沒有節點訪問權限。。。總之,一貫很便利的 crontab
命令竟然給我挖坑了。因而,我只得本身寫一個定時任務。編程
固然,核心功能是基於今天的主角 APScheduler
定時任務框架。windows
安裝只須要一行命令。bash
pip3 install apscheduler
複製代碼
若是對Python的環境搭建及模塊安裝還不熟悉,能夠看看我寫的另外一篇博客 Python環境搭建及模塊安裝 。多線程
首先介紹兩個最經常使用的調度器:框架
這是人說的話嗎?字我都看得懂,意思一點也不明白。。。
簡單說來,能夠把 BlockingScheduler
當作是單線程,若是在程序中僅僅只運行定時任務,那麼就應該選擇阻塞式調度器。
而把 BackgroundScheduler
當作是多線程,若是在程序中除了運行定時任務,我們還想同時作點別的計算啥的,那就應該選擇後臺調度器。ide
這裏我選擇使用 BlockingScheduler
阻塞式調度器,主程序只負責調度定時任務,不執行其餘計算等操做。 以下所示:函數
from apscheduler.schedulers.blocking import BlockingScheduler # 引入模塊
def task():
'''定時任務'''
os.system('python3 spider.py')
if __name__ == '__main__':
scheduler = BlockingScheduler()
# 添加任務
scheduler.add_job(task, 'cron', hour=11, minute=30)
scheduler.start()
複製代碼
運行上面這段代碼,就會在天天的11:30時執行 python3 spider.py
命令。工具
其中,出現了個新標籤 cron
,這玩意兒叫觸發器,能夠設置定時任務觸發的條件,這裏就簡單介紹一下這個小東西。
APScheduler有三種內置的觸發器:
日期,在某個具體的日期觸發定時任務,僅觸發一次。
# 在2020-1-3這一天的凌晨執行task函數
scheduler.add_job(task, 'date', run_date=date(2020, 1, 3))
# 在1990-12-22 14:30:22時執行task函數
scheduler.add_job(task, 'date', run_date='1990-12-22 14:30:22')
# 未指定時間,則會當即執行
scheduler.add_job(task, 'date')
複製代碼
如上所示,run_date 參數能夠是 date型
或 str型
,甚至能夠不顯式指定。
間隔,在某個時間間隔後觸發定時任務,間隔觸發無限次。
# 每隔1周3天8時20分5秒執行一次task函數
scheduler.add_job(task, 'interval', weeks=1,days=3,hours=8,minutes=20,seconds=5)
複製代碼
如上所示,weeks、days、hours、minutes、seconds 的參數都是 int型
。
週期,在某個週期內觸發定時任務,循環觸發無限次。
# 天天8時20分執行一次task函數
scheduler.add_job(task, 'cron', hour=8,minute=20)
# 從星期一到星期五的每一天8:20執行一次task函數,直到2100-05-20程序終止
scheduler.add_job(task, 'cron', day_of_week='mon-fri',hour=8,minute=20,end_date='2100-05-20')
複製代碼
該觸發器的規則和 crontab
相似。各參數的說明以下:
參數 | 說明 |
---|---|
year | int型或str,取值四位數的年份,如2020年 |
month | int型或str,取值範圍爲1-12月 |
week | int型或str,取值範圍爲第1-53周 |
day_of_week | int型或str,表示一週中的第幾天,既能夠用0-6表示也能夠用其英語縮寫表示(mon,tue,wed,thu,fri,sat,sun) |
day | int型或str,取值範圍爲1-31日 |
hour | int型或str,取值範圍爲0-23時 |
minute | int型或str,取值範圍爲0-59分 |
second | int型或str,取值範圍爲0-59秒 |
start_date | datetime型或str,表示開始時間 |
end_date | datetime型或str,表示結束時間 |
更多編程教學請關注公衆號:潘高陪你學編程