首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python大型项目后台异步这一篇就够了

python大型项目后台异步这一篇就够了

作者头像
python编程从入门到实践
修改2021-05-17 16:25:51
1.5K0
修改2021-05-17 16:25:51
举报

点击python编程从入门到实践,置顶 公众号重磅 python入门资料,第一时间送达

读完需要6分钟

速读仅需 2 分钟

/ 后台异步这一篇就够了 /

1

BackgroundTasks 使用场景

有时候我们需要在 request 执行之后继续一些操作,但终端并不需要等待这些操作完成才能收到 response 。我列举一些场景大家看一下:

1.在自动出票完成后需要向各 ota 平台自动发送行程单信息 2.在执行完购票后需要向各户发送邮件通知购票成功信息 3.收到客户端的文件之后对文件进行二次处理 4.... 5....

这些操作都需要一定的处理时间,但与返回给终端的 response 并无直接关系这个时候就可以通过定义后台任务 BackgroundTasks 来实现这个功能。

2

BackgroundTasks 实战

2.1

添加参数

首先我们需要导入 BackgroundTasks,并在路径操作函数中添加 BackgroundTasks 类型的参数。

# -*- encoding: utf-8 -*-
from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

@app.post("/send_info")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    """
    发送提醒任务
    """
  pass

2.2

任务函数

任务函数是指:在需要创建一个在后台任务中实际执行的函数。任务函数是一个标准函数。这个函数可以是 async def 或者 普通 def 的函数。

这里创建一个把指定内容写入文件的函数。

# -*- encoding: utf-8 -*-
def write_notification(email: str, message=""):
    """
    写入文件操作模拟任务
    """
    with open("log_test.txt", mode="w") as email_file:
        content = "notification for {}: {}".format(email,message)
        email_file.write(content)

2.3

添加后台任务

最后需要把任务函数添加到后台任务中

# -*- encoding: utf-8 -*-
import time
from fastapi import BackgroundTasks, FastAPI

app = FastAPI()

def write_notification(email: str, message=""):
    """
    写入文件操作模拟任务
    """
    time.sleep(5)
    with open("log_test.txt", mode="w") as email_file:
        content = "notification for {}: {}".format(email,message)
        email_file.write(content)
    print("write end")
    time.sleep(2)


@app.post("/send_info")
async def send_notification(email: str, background_tasks: BackgroundTasks):
    background_tasks.add_task(write_notification, email, message="some notification")

    return {"message": "now: %s Notification sent in the background" % time.time()}

2.4

add_task 解释

.add_task()接收以下参数信息:1.在后台运行的任务函数(例如 write_notification)2.任意序列的参数信息(例如 email)3.任意键值对的参数信息(例如 message="some notification")4.我们故意在 write_notification 方法中加入等待时间 来验证对于客户端的返回

2.5

依赖注入

后台任务可以与依赖注入系统一起使用,可以在不同层级的依赖项中声明 BackgroundTasks 参数,若对依赖注入系统还不是很熟悉的小伙伴可以会看一下上篇内容,本节就不做过多的解释了

# -*- encoding: utf-8 -*-
from typing import Optional
from fastapi import BackgroundTasks, Depends, FastAPI

app = FastAPI()


def write_log(message: str):
    with open("log.txt", mode="a") as log:
        log.write(message)


def get_query(background_tasks: BackgroundTasks, q: Optional[str] = None):
    if q:
      message = f"found query: {q}\n" background_tasks.add_task(write_log, message)
    return q


@app.post("/send_info")
async def send_notification(email: str, background_tasks: BackgroundTasks, q: str = Depends(get_query)):

    message = f"message to {email}\n" background_tasks.add_task(write_log, message)
    return {"message": "Message sent"}

1.若需要执行大量的后台计算而不必一定要在同一进程中运行,例如:它不需要共享内存,变量等,则可使用其他更大的工具,例如:celery、MQ 系列 都是可以选择的但这些往往需要更复杂的配置,例如:RabbitMQ、Redis 之类的消息作业队列管理器,但是它们允许在多个进程(尤其是多个服务器)中运行后台任务。 2.若需要从同一 FastAPI 应用访问变量和对象,或者需要执行一些小的后台任务 例如:发送电子邮件、短信消息等,则只需使用即可 BackgroundTasks。

我们启动项目看一下执行效果:

我坚信:思考问题的方法远大于具体解决问题的方案,让我们继续一路前行,下期再见!

原创不易,只愿能帮助那些需要这些内容的同行或刚入行的小伙伴,你的每次 点赞、分享 都是我继续创作下去的动力,我希望能在推广 python 技术的道路上尽我一份力量,欢迎在评论区向我提问,我都会一一解答,记得一键三连支持一下哦!

加入python学习交流微信群,请后台回复「入群」

往期推荐

python生产实战 python 闭包之庖丁解牛篇

大型fastapi项目实战 靠 python 中间件解决方案涨薪了

大型fastapi项目实战 高并发请求神器之aiohttp(下)

大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python编程从入门到实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档