跳转至

后台任务

后台任务在响应发送给客户端之后运行。用于不应阻塞响应的操作,如发送邮件、更新缓存或记录日志。

用法

通过 request.background_tasks 将任务加入队列:

from kui.asgi import request

@app.router.http.post("/notify")
async def notify():
    request.background_tasks.append(send_email, to="[email protected]")
    request.background_tasks.append(update_stats, event="notification")
    return {"status": "queued"}

async def send_email(to: str):
    # 发送邮件逻辑
    ...

async def update_stats(event: str):
    # 更新统计
    ...

request.background_tasks.append(func, *args, **kwargs) 将可调用对象及其参数加入队列。

执行顺序

任务在响应发送后按添加顺序依次执行。

同步与异步

支持同步和异步函数:

# 异步任务
async def send_email(to: str):
    await smtp.send(to=to, subject="Hello")

# 同步任务(在 ASGI 中也可以工作)
def log_event(message: str):
    logger.info(message)

request.background_tasks.append(send_email, to="[email protected]")
request.background_tasks.append(log_event, message="Email sent")
# 仅同步任务
def send_email(to: str):
    smtp.send(to=to, subject="Hello")

request.background_tasks.append(send_email, to="[email protected]")

注意事项

  • 后台任务与请求处理器在同一进程中执行。长时间运行的任务可能影响服务器吞吐量。
  • 对于繁重的工作,建议改用任务队列(Celery、RQ 等)。
  • 后台任务可以访问相同的应用状态,但无法访问原始的请求/响应对象。