Python中定時任務框架APScheduler入門教程

前言

更多內容,請訪問個人 我的博客python


談到定時任務,你們可能會優先想到 linux 中的 crontab ,或者 windows 中的任務計劃。這些工具用起來都很方便,可是說出來你可能不信,最近我在生信流程中使用 crontab 命令完成一些自動化操做時,遇到問題了。linux

不知是否是 crontab 命令不容許有 qsub 的提交操做,仍是管理員設置了 crontab 發起任務的用戶沒有節點訪問權限。。。總之,一貫很便利的 crontab 命令竟然給我挖坑了。因而,我只得本身寫一個定時任務。編程

固然,核心功能是基於今天的主角 APScheduler 定時任務框架。windows

安裝

安裝只須要一行命令。bash

pip3 install apscheduler
複製代碼

若是對Python的環境搭建及模塊安裝還不熟悉,能夠看看我寫的另外一篇博客 Python環境搭建及模塊安裝多線程

運行

首先介紹兩個最經常使用的調度器:框架

  • BlockingScheduler
    阻塞式調度器:適用於只跑調度器的程序。
  • BackgroundScheduler
    後臺調度器:適用於非阻塞的狀況,調度器會在後臺獨立運行。

這是人說的話嗎?字我都看得懂,意思一點也不明白。。。
簡單說來,能夠把 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有三種內置的觸發器:

date

日期,在某個具體的日期觸發定時任務,僅觸發一次。

# 在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型,甚至能夠不顯式指定。

interval

間隔,在某個時間間隔後觸發定時任務,間隔觸發無限次。

# 每隔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型

cron

週期,在某個週期內觸發定時任務,循環觸發無限次。

# 天天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,表示結束時間

更多編程教學請關注公衆號:潘高陪你學編程

image
相關文章
相關標籤/搜索