最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Flask實現(xiàn)定時任務(wù)的不同方法詳解

 更新時間:2025年08月14日 08:56:31   作者:Tzq@2018  
在 Flask 中實現(xiàn)定時任務(wù),最常用的方法是使用 APScheduler 庫,本文將提供一個完整的解決方案,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下

在 Flask 中實現(xiàn)定時任務(wù),最常用的方法是使用 APScheduler 庫(Advanced Python Scheduler)。下面我將提供一個完整的解決方案,包含代碼實現(xiàn)、解釋和生產(chǎn)環(huán)境注意事項。

完整實現(xiàn)方案

from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from datetime import datetime

app = Flask(__name__)
app.config['SCHEDULER_JOBSTORES'] = {
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.db')
}

# 創(chuàng)建調(diào)度器實例
scheduler = BackgroundScheduler(
    jobstores=app.config['SCHEDULER_JOBSTORES'],
    daemon=True
)

# 定義定時任務(wù)函數(shù)
def daily_report():
    """每天上午9點執(zhí)行的日報任務(wù)"""
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"[日報] 執(zhí)行時間: {current_time}")
    # 這里添加實際的日報生成邏輯

def every_5_minutes():
    """每5分鐘執(zhí)行一次的任務(wù)"""
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"[5分鐘任務(wù)] 執(zhí)行時間: {current_time}")
    # 這里添加實際的任務(wù)邏輯

def on_startup():
    """應(yīng)用啟動時添加定時任務(wù)"""
    # 添加每天9:00執(zhí)行的任務(wù)
    scheduler.add_job(
        id='daily_report_job',
        func=daily_report,
        trigger='cron',
        hour=9,
        minute=0,
        replace_existing=True
    )
    
    # 添加每5分鐘執(zhí)行的任務(wù)
    scheduler.add_job(
        id='every_5_minutes_job',
        func=every_5_minutes,
        trigger='interval',
        minutes=5,
        replace_existing=True
    )
    
    # 添加一次性任務(wù)(應(yīng)用啟動后10秒執(zhí)行)
    scheduler.add_job(
        id='startup_check',
        func=lambda: print("應(yīng)用啟動完成!"),
        trigger='date',
        run_date=datetime.now() + timedelta(seconds=10)
    )

# 啟動調(diào)度器
if not scheduler.running:
    scheduler.start()
    on_startup()

@app.route('/')
def home():
    return """
    <h1>Flask 定時任務(wù)示例</h1>
    <p>已啟動的定時任務(wù):</p>
    <ul>
        <li>日報任務(wù):每天9:00執(zhí)行</li>
        <li>5分鐘任務(wù):每5分鐘執(zhí)行一次</li>
    </ul>
    <p>查看控制臺輸出獲取執(zhí)行詳情</p>
    """

@app.route('/jobs')
def list_jobs():
    """查看當(dāng)前所有定時任務(wù)"""
    jobs = scheduler.get_jobs()
    job_list = [f"ID: {job.id}, 下次執(zhí)行: {job.next_run_time}" for job in jobs]
    return "
".join(job_list)

@app.route('/add_job/<minutes>')
def add_job(minutes):
    """動態(tài)添加定時任務(wù)"""
    try:
        minutes = int(minutes)
        job_id = f"dynamic_job_{minutes}min"
        
        scheduler.add_job(
            id=job_id,
            func=lambda: print(f"動態(tài)添加的任務(wù) - 每 {minutes} 分鐘執(zhí)行一次"),
            trigger='interval',
            minutes=minutes,
            replace_existing=True
        )
        
        return f"成功添加每 {minutes} 分鐘執(zhí)行的任務(wù)!"
    except ValueError:
        return "參數(shù)錯誤,請輸入有效的分鐘數(shù)"

@app.route('/remove_job/<job_id>')
def remove_job(job_id):
    """移除定時任務(wù)"""
    if scheduler.get_job(job_id):
        scheduler.remove_job(job_id)
        return f"已移除任務(wù): {job_id}"
    return "任務(wù)不存在"

if __name__ == '__main__':
    app.run(debug=True)

代碼解釋

1. 依賴安裝

pip install flask apscheduler

2. 核心組件

BackgroundScheduler:后臺線程調(diào)度器,不會阻塞主線程

SQLAlchemyJobStore:任務(wù)持久化存儲,使用SQLite數(shù)據(jù)庫

add_job():添加任務(wù)的核心方法

3. 任務(wù)類型

Cron任務(wù)(定時執(zhí)行):

trigger='cron', hour=9, minute=0  # 每天9:00執(zhí)行

間隔任務(wù)(周期性執(zhí)行):

trigger='interval', minutes=5  # 每5分鐘執(zhí)行

一次性任務(wù)

trigger='date', run_date=datetime.now() + timedelta(seconds=10)

4. 任務(wù)管理

動態(tài)添加任務(wù):通過路由 /add_job/<minutes> 添加新任務(wù)

任務(wù)列表查看:通過路由 /jobs 查看所有任務(wù)

任務(wù)刪除:通過路由 /remove_job/<job_id> 刪除任務(wù)

5. 持久化存儲

使用SQLite數(shù)據(jù)庫存儲任務(wù)信息,確保服務(wù)器重啟后任務(wù)不丟失:

jobstores={
    'default': SQLAlchemyJobStore(url='sqlite:///jobs.db')
}

生產(chǎn)環(huán)境部署注意事項

1. 多進(jìn)程問題解決方案

當(dāng)使用Gunicorn等WSGI服務(wù)器時(多worker進(jìn)程),每個worker都會啟動調(diào)度器實例,導(dǎo)致任務(wù)重復(fù)執(zhí)行。

解決方案:

# 在應(yīng)用工廠函數(shù)中初始化調(diào)度器
def create_app():
    app = Flask(__name__)
    
    if os.environ.get('WERKZEUG_RUN_MAIN') == 'true' or not app.debug:
        # 確保只在主進(jìn)程中初始化調(diào)度器
        scheduler = BackgroundScheduler(daemon=True)
        scheduler.start()
        # 添加任務(wù)...
    
    return app

2. 替代方案:Celery

對于分布式環(huán)境,推薦使用Celery:

# Celery配置示例
from celery import Celery
from celery.schedules import crontab

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # 每10分鐘執(zhí)行
    sender.add_periodic_task(600, task1.s(), name='每10分鐘任務(wù)')
    
    # 每天午夜執(zhí)行
    sender.add_periodic_task(
        crontab(hour=0, minute=0),
        task2.s(),
        name='每日午夜任務(wù)'
    )

@app.task
def task1():
    print("執(zhí)行每10分鐘任務(wù)")

@app.task
def task2():
    print("執(zhí)行每日任務(wù)")

3. 錯誤處理與日志

def job_with_error_handling():
    try:
        # 業(yè)務(wù)代碼
        pass
    except Exception as e:
        app.logger.error(f"任務(wù)執(zhí)行失敗: {str(e)}")
        # 發(fā)送警報郵件
        send_alert_email(f"任務(wù)失敗: {str(e)}")
        
def send_alert_email(message):
    # 實現(xiàn)郵件發(fā)送邏輯
    pass

方案對比

特性APSchedulerCelery
復(fù)雜度簡單中等
分布式支持有限優(yōu)秀
持久化需要配置內(nèi)置
多進(jìn)程支持需要特殊處理原生支持
任務(wù)隊列
適用場景單機(jī)/簡單任務(wù)分布式/復(fù)雜任務(wù)

到此這篇關(guān)于Python Flask實現(xiàn)定時任務(wù)的不同方法詳解的文章就介紹到這了,更多相關(guān)Flask定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之

相關(guān)文章

  • 小白入門篇使用Python搭建點擊率預(yù)估模型

    小白入門篇使用Python搭建點擊率預(yù)估模型

    本文將從零開始,僅僅利用基礎(chǔ)的numpy庫,使用Python實現(xiàn)一個最簡單的神經(jīng)網(wǎng)絡(luò)(或者說是簡易的LR,因為LR就是一個單層的神經(jīng)網(wǎng)絡(luò)),解決一個點擊率預(yù)估的問題。感興趣的朋友跟隨小白一起看看吧
    2018-10-10
  • keras 權(quán)重保存和權(quán)重載入方式

    keras 權(quán)重保存和權(quán)重載入方式

    這篇文章主要介紹了keras 權(quán)重保存和權(quán)重載入方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python 條件,循環(huán)語句詳解

    Python 條件,循環(huán)語句詳解

    這篇文章主要介紹了詳解Python中的條件,循環(huán)語句,循環(huán)語句是學(xué)習(xí)各個編程語言的最基本的基礎(chǔ)知識,需要的朋友可以參考下
    2021-09-09
  • Python新手學(xué)習(xí)函數(shù)默認(rèn)參數(shù)設(shè)置

    Python新手學(xué)習(xí)函數(shù)默認(rèn)參數(shù)設(shè)置

    在本篇文章里小編給大家分享的是關(guān)于Python新手學(xué)習(xí)函數(shù)默認(rèn)參數(shù)設(shè)置的相關(guān)知識點,需要的朋友們可以參考下。
    2020-06-06
  • python linecache 處理固定格式文本數(shù)據(jù)的方法

    python linecache 處理固定格式文本數(shù)據(jù)的方法

    今天小編就為大家分享一篇python linecache 處理固定格式文本數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python通過OpenPyXL處理Excel的完整教程

    Python通過OpenPyXL處理Excel的完整教程

    OpenPyXL是一個強大的Python庫,用于處理Excel文件,允許讀取、編輯和創(chuàng)建Excel工作簿和工作表,本文將詳細(xì)介紹OpenPyXL的各種功能,希望對大家有所幫助
    2023-11-11
  • 基于Python實現(xiàn)大文件分割和命名腳本過程解析

    基于Python實現(xiàn)大文件分割和命名腳本過程解析

    這篇文章主要介紹了基于Python實現(xiàn)大文件分割和命名腳本過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python實現(xiàn)文件及文件夾操作大全

    Python實現(xiàn)文件及文件夾操作大全

    在日常工作或生活中,總避免不了需要操作文件或文件夾,本文主要介紹了Python實現(xiàn)文件及文件夾操作大全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • PyQt5 QFrame控件的用法詳解

    PyQt5 QFrame控件的用法詳解

    在PyQt5中,QFrame是一個重要的基類,它提供了邊框樣式、陰影效果、形狀等屬性,可以幫助開發(fā)者實現(xiàn)豐富多彩的界面效果,本文將結(jié)合實際案例,詳細(xì)介紹QFrame在PyQt5中的用法,需要的朋友可以參考下
    2024-08-08
  • 在Python?中將類對象序列化為JSON

    在Python?中將類對象序列化為JSON

    這篇文章主要介紹了在Python?中將類對象序列化為JSON,序列化是將對象轉(zhuǎn)換為可以在以后保存和檢索介質(zhì)中的過程,下文具體的內(nèi)容分享,需要的朋友可以參考一下
    2022-04-04

最新評論

东港市| 富阳市| 新田县| 平武县| 深水埗区| 姚安县| 杭锦旗| 专栏| 阿城市| 大余县| 兖州市| 浏阳市| 永寿县| 平昌县| 泌阳县| 郎溪县| 大同市| 临夏县| 始兴县| 岳西县| 陵水| 武鸣县| 兖州市| 略阳县| 正安县| 新余市| 盘山县| 宁化县| 白朗县| 永嘉县| 雷州市| 綦江县| 南皮县| 屏南县| 确山县| 关岭| 外汇| 河北省| 尤溪县| 云霄县| 普定县|