1. 程式人生 > 實用技巧 >flask_apscheduler 定時任務框架

flask_apscheduler 定時任務框架

flask 框架下定時任務通常使用flask_apscheduler 第三方庫。flask_apscheduler 功能非常強大,能滿足各種定時任務的需求。

安裝

pip3 install flask_apscheduler

使用方法

1.下面這段 example 是官網上的,我加了些註釋,方便學習。

from flask import Flask
from flask_apscheduler import APScheduler


class Config(object):
    JOBS = [
        {
            'id': 'job1',                #
一個標識 'func': '__main__:job1', # 指定執行的函式 'args': (1, 2), # 傳入函式的引數 'trigger': 'interval', # 指定 定時任務的型別 'seconds': 10 # 執行的間隔時間 } ] SCHEDULER_API_ENABLED = True def job1(a, b): #
執行的定時任務的函式 print(str(a) + ' ' + str(b)) if __name__ == '__main__': app = Flask(__name__) # 例項化flask app.config.from_object(Config()) # 為例項化的 flask 引入配置 scheduler = APScheduler() # 例項化 APScheduler # it is also possible to enable the API directly
# scheduler.api_enabled = True scheduler.init_app(app) # 把任務列表放入 flask scheduler.start() # 啟動任務列表 app.run() # 啟動 flask

2.多個定時任務

Config 類的屬性 JOBS 是列表,可以定義多個定時任務,如下

from flask import Flask
from flask_apscheduler import APScheduler


class Config(object):
    JOBS = [
        {
            'id': '1',
            'func': '__main__:job1',
            'args': (1, 2),
            'trigger': 'interval',
            'seconds': 10
        },
        {
            'id': '2',
            'func': '__main__:job2',
            'trigger': 'interval',
            'seconds': 10
        }
    ]

    SCHEDULER_API_ENABLED = True


def job1(a, b):
    print(str(a) + ' ' + str(b))

def job2():
    print('Hello world!')


if __name__ == '__main__':
    app = Flask(__name__)
    app.config.from_object(Config())

    scheduler = APScheduler()
    # it is also possible to enable the API directly
    # scheduler.api_enabled = True
    scheduler.init_app(app)
    scheduler.start()

    app.run()
View Code

觸發器型別

當你開始定時任務時,需要為定時策略選擇一個觸發器(設定 class Config 中 trigger 的值)。flask_apscheduler 提供了三種類型的觸發器。

  • date 一次性指定固定時間,只執行一次
  • interval 間隔排程,隔多長時間執行一次
  • cron 指定相對時間執行,比如:每月1號、每星期一執行

一、date 最基本的一種排程,指定固定時間,只執行一次

  • run_date(str)–精確時間
class Config(object):
    JOBS = [
        {
            'id': 'job1',                
            'func': '__main__:job1',          
            'args': (1, 2),              
            'trigger': 'date',                        # 指定任務觸發器 date 
            'run_date': '2020-7-23 16:50:00'          # 指定時間 2020-7-23 16:50:00 執行
        }
    ]

    SCHEDULER_API_ENABLED = True

二、interval 通過設定時間間隔 來執行定時任務

  • weeks(int)–間隔幾周
  • days(int)–間隔幾天
  • hours(int)–間隔幾小時
  • minutes(int)–間隔幾分鐘
  • seconds(int)–間隔多少秒
  • start_date(datetime|str)–開始日期
  • end_date(datetime|str)–結束日期
class Config(object):
    JOBS = [
        {
            'id': 'job1',                
            'func': '__main__:job1',          
            'args': (1, 2),              
            'trigger': 'interval',                        # 指定任務觸發器 interval
            'hours': 5                                     # 每間隔5h執行
        }
    ]

    SCHEDULER_API_ENABLED = True

三 、cron 通過設定相對時間來執行定時任務

  • year(int|str)–年,4位數字
  • month(int|str)–月(範圍1-12)
  • day(int|str)–日(範圍1-31)
  • week(int|str)–周(範圍1-53)
  • day_of_week(int|str)–周內第幾天或者星期幾(範圍0-6或者mon,tue,wed,thu,fri,sat,sun)
  • hour(int|str)–時(範圍0-23)
  • minute(int|str)–分(範圍0-59)
  • second(int|str)–秒(範圍0-59)
  • start_date(datetime|str)–最早開始日期(包含)
  • end_date(datetime|str)–最晚結束時間(包含)
class Config(object):
    JOBS = [
        {
            'id': 'job1',                
            'func': '__main__:job1',          
            'args': (1, 2),              
            'trigger': 'cron',                            # 指定任務觸發器 cron
            'day_of_week': 'mon-fri',              # 每週1至周5早上6點執行 
            'hour': 6,
            'minute': 00                                    
        }
    ]

    SCHEDULER_API_ENABLED = True

設定時區

開發好定時指令碼後部署到 K8S,發現報錯Timezone offset does not match system offset: 0 != 28800. Please, check your config files.

本地執行好好的,為什麼伺服器上就報錯了呢?

原因是系統的時區和程式碼執行的時區不一致導致的。解決方法是在初始化 APScheduler() 的時候加上時區:BackgroundScheduler(timezone="Asia/Shanghai")

'''...'''
from apscheduler.schedulers.background import BackgroundScheduler

class config:
    JOBS = ['''...''']
    SCHEDULER_TIMEZONE = 'Asia/Shanghai'

'''...'''

if __name__ == '__main__':
    scheduler = APScheduler(BackgroundScheduler(timezone="Asia/Shanghai"))
    scheduler.init_app(app)
    scheduler.start()
    app.run()