成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

FastAPI 背景任務全解析:異步執行長任務的正確姿勢!

開發
這篇文章,帶你徹底掌握 FastAPI 的后臺任務機制(Background Tasks):它不是 async,不是 Celery,但輕巧高效,正是你項目中最實用的異步利器之一!

你是否遇到這種場景:

  • 注冊接口響應太慢,只因要發送郵件?
  • 每次寫日志都阻塞了響應返回?
  • 想跑個后臺任務,卻不知從哪開始?

這篇文章,帶你徹底掌握 FastAPI 的后臺任務機制(Background Tasks):它不是 async,不是 Celery,但輕巧高效,正是你項目中最實用的異步利器之一!

什么是 Background Tasks?

Background Tasks 是 FastAPI 提供的一種輕量異步任務執行方式。

它的核心思路:

  • 在 HTTP 請求響應返回之后,自動執行一段你注冊好的函數
  • 適用于不需要立即返回結果、也不強依賴成功率的任務

例如:

  • 發郵件(用戶不需要等發完郵件才得到響應)
  • 寫日志(用戶不需要日志寫完才看到結果)
  • 異步清理操作、緩存刷新、埋點統計等

如何使用 BackgroundTasks?

基本用法:

from fastapi import FastAPI, BackgroundTasks

app = FastAPI()

def write_log(message: str):
    with open("log.txt", "a") as f:
        f.write(f"{message}\n")

@app.post("/log")
async def log_operation(background_tasks: BackgroundTasks):
    background_tasks.add_task(write_log, "用戶訪問了 /log 接口")
    return {"message": "操作已記錄(異步執行)"}

參數說明:

參數

說明

BackgroundTasks

FastAPI 自動注入的后臺任務對象

add_task(func, *args, **kwargs)

注冊后臺執行的函數和參數

你的函數(非 async)

必須是普通函數(同步),不能是 async 函數!

為什么函數不能是 async 的?

因為 FastAPI 的 BackgroundTasks 是基于 Starlette 的同步回調機制,它在響應后通過事件循環注冊任務,并同步執行你傳入的函數。

如果你寫成 async def,它不會被 await,也不會進入事件循環,最終無法運行。

如果我一定要運行 async 函數怎么辦?

可以使用 Python 的 asyncio.create_task() 方法間接執行:

import asyncio

asyncdefasync_job():
    print("異步任務開始")
    await asyncio.sleep(2)
    print("異步任務結束")

defwrapper_async_job():
    asyncio.create_task(async_job())  # 間接運行 async 函數

@app.get("/run")
asyncdefrun(background_tasks: BackgroundTasks):
    background_tasks.add_task(wrapper_async_job)
    return {"msg": "異步任務已觸發"}

這樣就能兼顧 async def 與 BackgroundTasks!

真實案例:注冊后異步發送郵件

文件結構如下:

project/
├── main.py
└── tasks/
    └── email.py

tasks/email.py:

import time

def send_welcome_email(email: str):
    time.sleep(3)  # 模擬耗時任務
    print(f"?? 歡迎郵件已發送到 {email}")

main.py:

from fastapi import FastAPI, BackgroundTasks
from tasks.email import send_welcome_email

app = FastAPI()

@app.post("/register")
async def register(email: str, background_tasks: BackgroundTasks):
    # 假設已完成注冊流程
    background_tasks.add_task(send_welcome_email, email)
    return {"msg": "注冊成功,歡迎郵件將在后臺發送"}

用戶幾乎瞬間得到響應,而郵件將在后臺異步執行,提升體驗。

支持多個后臺任務?

當然可以!只需多次調用 add_task():

background_tasks.add_task(write_log, "用戶注冊")
background_tasks.add_task(send_welcome_email, email)
background_tasks.add_task(refresh_cache, user_id)

它們會按順序在響應后依次執行。

與 Depends 依賴注入結合使用

你可以在依賴函數里注入 BackgroundTasks,實現邏輯更解耦:

def audit(background_tasks: BackgroundTasks):
    background_tasks.add_task(write_log, "訪問審計")
    return

@app.get("/data")
async def get_data(dep=Depends(audit)):
    return {"msg": "數據已獲取"}

更高級的場景中,你可以把審計、埋點、通知等邏輯都封裝進 Depends,主業務邏輯保持干凈清晰。

BackgroundTasks 適合什么場景?

適合:

場景

示例

郵件通知

注冊成功、忘記密碼等

日志記錄

用戶行為埋點、接口訪問日志

文件清理

上傳后刪除舊文件

緩存更新

數據變動后刷新緩存

不適合:

  • 需要 重試、隊列控制、任務狀態追蹤 的任務
  • 耗時非常長、可能失敗的操作

對此建議使用 Celery、Dramatiq、APScheduler 等專業方案。

多任務并發支持嗎?

支持,但有限制:

  • 每個請求的任務是串行執行的,不并發
  • 如果任務內部使用了 asyncio.create_task(),可以實現并發邏輯
  • 要實現更強大的并發處理,建議交給專門的任務系統處理(如 Celery)

與 Celery 的對比

特性

BackgroundTasks

Celery

部署復雜度

簡單,無需額外組件

依賴 Redis/RabbitMQ

是否異步

?

?

重試機制

? 無

? 自動重試

任務隊列

? 無

? 內置隊列系統

狀態追蹤

? 無

? 支持狀態與監控

適用場景

簡單后臺邏輯

復雜異步任務

總結

FastAPI 的 BackgroundTasks 非常適合:

  • 小而輕的異步任務(如發郵件、寫日志)
  • 不要求任務可追蹤、重試的場景
  • 快速開發原型、簡潔易用的后端服務
責任編輯:趙寧寧 來源: Ssoul肥魚
相關推薦

2009-07-28 15:30:34

ASP.NET多線程

2025-06-03 08:15:00

微服務架構異步任務隊列

2023-01-03 10:38:04

函數計算技術

2025-05-08 08:00:00

FastAPI開發異步定時

2024-08-12 10:13:01

2020-07-02 07:44:27

Spring教程異步

2022-06-02 10:18:24

函數計算異步

2024-10-14 13:12:59

2023-07-31 08:05:30

Spring任務調度

2018-01-11 15:31:39

命令Linux關機

2011-08-30 10:20:41

Silverlight

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開發

2021-04-19 11:10:45

PythonSQLExcel

2024-04-09 08:04:42

C#結構await

2014-04-24 09:49:57

Android測試異步任務

2023-11-03 14:32:38

2014-12-02 10:02:21

Android異步任務

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看精品视频网站 | 欧美国产一区二区三区 | 武道仙尊动漫在线观看 | 91av在线视频观看 | 男女网站在线观看 | 国产精品久久久久久久久久久久冷 | 色女人天堂 | 亚洲国产成人一区二区 | 国产欧美一区二区三区在线看 | 精品一区二区三区在线观看 | 久久久美女 | 日韩中文一区二区 | 成年人黄色一级毛片 | 欧美久久久网站 | 在线一区二区三区 | 亚洲国产精品视频 | 国产成人精品午夜视频免费 | 91中文字幕 | 日韩中文字幕免费在线观看 | 久久不射网 | 日韩国产欧美一区 | 欧美一区二区三区视频在线观看 | 亚洲精品在线视频 | 久久精品91久久久久久再现 | 欧美一级二级视频 | 欧美在线一区二区三区 | 99福利| 欧美成人免费在线视频 | 久久涩涩| 日韩中文字幕视频在线 | 99爱免费 | 日韩α片| 日韩中文字幕在线观看视频 | 亚洲欧美在线观看 | 91人人在线 | 国产精品黄视频 | 国产免费一区二区三区最新6 | 亚洲精品免费在线 | a免费视频 | 精品国产乱码久久久久久闺蜜 | 精品欧美一区免费观看α√ |