Python 常用定時任務框架介紹及代碼舉例

文章目錄

  • Python 常用定時任務框架簡介
      • 🧩 一、輕量級方案(適合簡單任務)
        • 1. **`schedule`庫**
      • ?? 二、中級方案(平衡功能與復雜度)
        • 2. **APScheduler**
        • 3. **Celery + Celery Beat**
      • 🚀 三、異步專用方案(高性能I/O密集型)
        • 4. **AsyncIOScheduler(APScheduler子類)**
        • 5. **aiocron**
      • 🔍 四、框架橫向對比
      • ?? 五、避坑指南
      • 💎 總結

Python 常用定時任務框架簡介

以下是對Python主流定時任務框架的詳細對比及使用指南,我們可結合場景需求可快速定位合適方案:


🧩 一、輕量級方案(適合簡單任務)

1. schedule
  • 特點:語法直觀,無需復雜配置,適合小型腳本或低頻任務。

  • 安裝

    uv add schedule
    
  • 示例代碼

    import schedule
    import timedef job():print(f"Task executed at {time.strftime('%Y-%m-%d %H:%M:%S')}")# 每10秒鐘執行一次
    schedule.every(10).seconds.do(job)
    # 每天16:00執行
    schedule.every().day.at("16:00").do(job)while True:schedule.run_pending()time.sleep(1)
    

    schedule

  • 適用場景:單機腳本、低頻任務(如每日報表生成)。

  • 缺點:不支持持久化或動態任務管理。


?? 二、中級方案(平衡功能與復雜度)

2. APScheduler
  • 核心優勢

    • 支持三種觸發器:interval(固定間隔)、cron(類Linux Cron語法)、date(單次任務)。
    • 可持久化任務到數據庫(SQLite/MongoDB/Redis等)。
    • 提供異步調度器(AsyncIOScheduler)兼容asyncio
  • 安裝

    uv add apscheduler
    
  • 示例代碼

    from apscheduler.schedulers.background import BackgroundScheduler
    import timedef job():print(f"Task executed at {time.strftime('%Y-%m-%d %H:%M:%S')}")# 創建調度器
    scheduler = BackgroundScheduler()
    # 每20秒執行(interval模式)
    scheduler.add_job(job, 'interval', seconds=20)
    # 每天16點08分執行(cron模式)
    scheduler.add_job(job, 'cron', hour=16, minute=8)scheduler.start()
    try:while True:time.sleep(2)
    except KeyboardInterrupt:scheduler.shutdown()
    

    apscheduler

  • 適用場景:需動態增刪任務(如Web后臺定時任務)、復雜調度邏輯(如每月最后一個工作日)。

3. Celery + Celery Beat
  • 特點:分布式任務隊列,天然支持異步和橫向擴展,需搭配消息中間件(如Redis/RabbitMQ)。

  • 安裝

    uv add celery
    

    本文使用Redis故需要安裝上含有Redis訪問庫的版本,否則訪問Redis會報錯,使用如下語句:

    uv add celery[redis]
    
  • 示例代碼

      # tasks.pyfrom celery_app import app@app.taskdef add(x: int, y: int) -> int:result = x + yprint("add task result ", result)return result@app.taskdef multiply(x: int, y: int) -> int:result = x * yprint("multiply task ", result)return result# celery_app.pyfrom celery import Celeryfrom celery.schedules import crontabapp = Celery('celery_app', broker='redis://localhost:6379/0')# 設置時區為東八區app.conf.timezone = 'Asia/Shanghai'app.conf.update(result_backend='redis://localhost:6379/0',beat_schedule={'add-every-10-seconds': {'task': 'tasks.add','schedule': 10.0, # run every 10 seconds'args': (10, 10)},'multiply-at-1715': {'task': 'tasks.multiply','schedule': crontab(hour='17', minute='15'),'args': (4, 5)}},include=['tasks'])    
    

    該方案執行起來相對復雜了些:

    1. 首先啟動 Celery worker:celery -A celery_app worker --loglevel=info

    2. 【可選】如需觀察定時任務自動運行,可啟動 Celery beat:celery -A celery_app beat --loglevel=info

    3. 你也可以通過運行腳本手動觸發任務

    celery

    # main.py
    from tasks import add if __name__ == "__main__":result = add.delay(4, 5)print('Task result: ', result.get())
    
  • 適用場景:分布式系統、高可用需求(如微服務集群定時任務)。


🚀 三、異步專用方案(高性能I/O密集型)

4. AsyncIOScheduler(APScheduler子類)
  • 用途:在異步環境中調度協程任務。

  • 示例

    from apscheduler.schedulers.asyncio import AsyncIOScheduler
    import asyncio
    import time
    import osdef tick():print(f"Tick! The time is: {time.strftime('%Y-%m-%d %H:%M:%S')}")async def main():scheduler = AsyncIOScheduler()scheduler.add_job(tick, 'interval', seconds=5)scheduler.start()print("Press Ctrl+{} to exit".format("Break" if os.name == "nt" else "C"))while True:await asyncio.sleep(1000)if __name__ == "__main__":# Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.try:asyncio.run(main())except (KeyboardInterrupt, SystemExit):pass   
    

    async

5. aiocron
  • 特點:極簡異步Cron調度器,語法類似Unix cron。

  • 安裝

    uv add aiocron
    
  • 示例

    import asyncio
    import datetime
    import aiocron# 定義一個簡單的異步函數
    async def attime_job():"""這個協程會每分鐘被調用一次。"""print(f"[{datetime.datetime.now()}] 你好,世界!這是一個每分鐘執行的任務。")# 定義另一個需要參數的異步函數
    async def attime_job_with_args(name):"""這個協程會在每小時的第5分鐘被調用。"""print(f"[{datetime.datetime.now()}] 你好,{name}!這是一個帶參數的任務。")await asyncio.sleep(1) # 模擬一些 I/O 操作print(f"[{datetime.datetime.now()}] {name} 的任務執行完畢。")if __name__ == '__main__':print("程序啟動,等待定時任務執行... (按 Ctrl+C 退出)")# 1. 創建一個每分鐘執行的 cron 任務 ('* * * * * *')# cron 格式: a b c d e# a: 分鐘 (0-59)# b: 小時 (0-23)# c: 日 (1-31)# d: 月 (1-12)# e: 周幾 (0-6, 0是周日)aiocron.crontab('* * * * *', func=attime_job)# 2. 創建一個在每小時的第 5 分鐘執行的任務#    并向任務函數傳遞參數 'Python'aiocron.crontab('5 * * * *', func=attime_job_with_args, args=('Python',))# 創建并運行 asyncio 事件循環# loop.run_forever() 會一直運行,直到被停止loop = asyncio.get_event_loop()try:loop.run_forever()except KeyboardInterrupt:print("\n程序被用戶中斷。")finally:loop.close()print("事件循環已關閉。")
    

    aiocron


🔍 四、框架橫向對比

框架適用場景異步支持持久化分布式學習成本
schedule小型腳本、低頻任務????
APScheduler單機復雜調度、動態任務管理?(選配)????
Celery + Beat分布式系統、高可用場景??????
AsyncIOScheduler異步應用(如FastAPI/Starlette)?????
aiocron極簡異步定時任務????

💎 推薦策略

  • 快速驗證或簡單腳本 → schedule
  • 單機復雜調度(如動態啟停任務) → APScheduler
  • 分布式生產環境 → Celery
  • 異步應用(如FastAPI) → AsyncIOScheduler

?? 五、避坑指南

  1. 阻塞問題
    • 避免在同步調度器(如BackgroundScheduler)中調用耗時同步任務,否則會阻塞主線程。異步任務需用AsyncIOScheduler
  2. 持久化配置
    • APScheduler若需重啟后保留任務,務必配置jobstore(如SQLite)。
  3. 時區陷阱
    • 所有調度器默認使用UTC時間,需顯式設置時區(如scheduler = BackgroundScheduler(timezone="Asia/Shanghai"))。

💎 總結

根據場景復雜度與規模選擇框架:輕量級選schedule,單機靈活調度用APScheduler,分布式系統用Celery,異步生態選AsyncIOScheduleraiocron。務必注意任務持久化和時區配置,避免生產環境故障。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86274.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用redis服務的redisson架構實現分布式鎖

加鎖 /*** 嘗試為指定的許可證 ID 獲取分布式鎖。如果鎖已被占用,則立即拋出業務異常。** param licenseId 需要加鎖的許可證 ID(即鎖名稱)* return true 表示成功獲取鎖,但請注意:* 鎖實際持有時間為 30 秒…

HTML表格元素

HTML表格元素深度解析與實戰應用 一、表格基本結構與語義化 1. 基礎表格元素詳解 <table> 容器元素 核心作用&#xff1a;定義表格容器重要屬性&#xff1a; border&#xff1a;已廢棄&#xff0c;應使用CSS設置邊框aria-label/aria-labelledby&#xff1a;為屏幕閱讀…

如何使用 Dockerfile 創建自定義鏡像

使用 Dockerfile 創建自定義鏡像的過程非常清晰&#xff0c;通常包括定義基礎鏡像、安裝依賴、復制代碼、設置環境變量和啟動命令等步驟。下面詳細講解從零創建自定義鏡像的完整流程。 一、什么是 Dockerfile&#xff1f; Dockerfile 是一個文本文件&#xff0c;定義了如何構建…

設置AWS EC2默認使用加密磁盤

問題 EC2磁盤需要使用默認加密。這里需要設置一下默認加密。 EC2

【樹的概念及其堆的實現】

樹的概念及其堆的實現 1.樹的概念2.樹的相關概念3.二叉樹的概念4. 滿二叉樹和完全二叉樹5.二叉樹的存儲結構6.二叉樹順序結構的實現的7.堆的結構及其實現 1.樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系…

鴻蒙系統(HarmonyOS)經典紅色風格登錄頁布局

預覽 簡介 基于鴻蒙系統&#xff08;HarmonyOS&#xff09;開發的現代化登錄界面&#xff0c;采用了科技感十足的紅色主題設計。該界面結合了流暢的動畫效果、精心設計的視覺元素和人性化的交互體驗&#xff0c;為用戶提供了一個安全、美觀且易用的登錄入口。 &#x1f3a8; …

C++虛函數多態

class C{ public:void x1(){};void x2(){};};C c; cout << sizeof(c) <<"\n";1字節 class D{ public:void x1(){};void x2(){};virtual void x3(){};//void *vptr看不見的虛函數表指針 }; D d; cout << sizeof(d) <<"\n";8字節類A…

新編輯器編寫指南--給自己的備忘

歡迎使用Markdown編輯器 你好&#xff01; 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章&#xff0c;了解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能拓展與語法支持&#x…

目標檢測neck算法之MPCA和FSA的源碼實現

目標檢測neck算法之MPCA和FSA的源碼實現 使用BIBM2024 Spatial-Frequency Dual Domain Attention Network For Medical Image Segmentation的Frequency-Spatial Attention和Multi-scale Progressive Channel Attention改進neck. 接下來&#xff0c;我將講解它的源碼操作的實現…

MyBatis-Plus的3.5.7和PageHelper的那個版本對應

MyBatis-Plus的3.5.7和PageHelper的那個版本對應 根據你的知識庫中提到的信息&#xff1a; MyBatis-Plus 3.5.7 使用的是 JSqlParser 4.6 版本。PageHelper 若使用了不同版本的 JSqlParser&#xff08;如 4.7&#xff09;&#xff0c;會導致沖突。 ? 推薦對應關系 為了保證…

Apifox 6 月產品更新|支持 AI 能力、交互優化、在線文檔新增 SEO 設置、gRPC 項目支持前/后置操作

在 2025 年的 API 開發領域&#xff0c;Apifox 作為一款集 API 設計、調試、Mock 和測試于一體的協作平臺&#xff0c;已成為開發者的“得力助手”。然而&#xff0c;隨著業務需求的不斷增長&#xff0c;開發者對工具的效率和功能提出了更高的要求。6 月份&#xff0c;Apifox 推…

Acrobat JavaScript 從瀏覽器到 PDF 環境的轉換

目錄 什么是 JavaScript?JavaScript 核心語言與 Acrobat 特定 API學習 JavaScript 核心語言的挑戰瀏覽器與 Acrobat JavaScript 的關鍵差異在 Acrobat 中運行 JavaScript 代碼替代瀏覽器特定函數的方法后續學習建議什么是 JavaScript? JavaScript 最初于 1995 年作為 Netsca…

OpenCV CUDA模塊設備層-----指數運算函數exp()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 設備端數學函數 中的一個內聯函數&#xff0c;用于在 GPU 上對 uchar1 類型&#xff08;單通道圖像像素&#xff09;執行指數運算…

C++面向對象5——C++關鍵字、構造函數與拷貝構造函數

this關鍵字 C關鍵字this的深度解析 1. this指針的本質 在C中&#xff0c;this是一個特殊的隱式指針&#xff0c;它存在于每個非靜態成員函數內部&#xff0c;指向調用該函數的當前對象。其類型為&#xff1a; 對于非const成員函數&#xff1a;ClassName* const&#xff08;…

人工智能專業:探索未來的智慧前沿

親戚家的小孩剛高考完&#xff0c;問我人工智能專業是學什么、做什么的。趁機就寫一篇吧&#xff01; 人工智能專業&#xff1a;探索未來的智慧前沿 人工智能&#xff08;Artificial Intelligence&#xff0c;簡稱AI&#xff09;無疑是當今最熱門、最具顛覆性的技術之一。它正…

618風控戰升級,瑞數信息“動態安全+AI”利劍出鞘

每年的618電商促銷季&#xff0c;都是各大電商平臺和商家的兵家必爭之地。數以億計的消費者涌入線上平臺&#xff0c;期待已久的優惠券、秒殺商品如潮水般涌現&#xff0c;海量交易在瞬間達成&#xff0c;無疑是一場商業狂歡。 然而&#xff0c;在這場狂歡背后&#xff0c;自動…

神經網絡的架構

神經網絡中的基本術語 以上圖為例&#xff0c;相關的術語描述如下&#xff1a; 最左邊的稱為輸?層&#xff0c;其中的神經元稱為輸?神經元&#xff1b;最右邊的&#xff0c;即輸出層包含有輸出神經元&#xff1b;本例中的輸出神經元只有一個&#xff1b;中間層&#xff0c;既…

安全生產監測預警系統:構筑智能化的安全防線

安全生產監測預警系統是工業安全管理的核心工具&#xff0c;它利用物聯網、大數據、人工智能等技術&#xff0c;實現對生產環境、設備運行和人員行為的全方位監測&#xff0c;確保風險早發現、早預警、早處置。其核心功能涵蓋實時監測、智能預警、應急處置、數據分析與優化等多…

Java練習題精選6-10

Java練習題精選6-10 一、第六題二、第七題第八題第九題第十題 一、第六題 如何將兩個變量的值進行交換&#xff1f;假設變量a1&#xff0c;b2。 public class Main {public static void main(String[] args) {int a 1;int b 2;int tmp;System.out.println("交換前a&qu…

【GESP】C++四級考試大綱知識點梳理, (2) 結構體和二維數組

GESP C四級官方考試大綱中&#xff0c;共有11條考點&#xff0c;本文針對第2條考點進行分析介紹。 &#xff08;2&#xff09;掌握 C結構體、二維及多維數組的基本概念及使用 四級其他考點回顧&#xff1a; 【GESP】C四級考試大綱知識點梳理, (1) 指針 全文詳見&#xff1a;【G…