首页 > 编程语言 >fastapi后台任务模块<BackgroundTasks>源码理解

fastapi后台任务模块<BackgroundTasks>源码理解

时间:2023-08-09 15:56:52浏览次数:43  
标签:__ 异步 fastapi self args 源码 kwargs 后台任务

 

 该文档主要对fastapi的后台模块《BackgroundTasks》一些源码的理解, 这样也可以加深理解异步及后台任务处理的理解。

  使用导入例子:

  from fastapi import BackgroundTasks

  

from fastapi import BackgroundTasks, FastAPI

app = FastAPI()


def write_file(data: str):
with open("log.txt", mode="w") as w:
w.write(data)


@app.post("/write-file/")
async def send_notification(data: str, background_tasks: BackgroundTasks):
background_tasks.add_task(write_notification, data)
return {"message": "Notification sent in the background"}

 

 BackgroundTasks源码图:

 

  

从上面使用例子

background_tasks.add_task(write_notification, data)

可看出它是接收了需后台处理的方法,及相关参数传入 background_tasks

 

从源码看:

BackgroundTasks 引用了BackgroundTask 类

BackgroundTask类是初始化接收方法参数,以及写了个__call__的异步调度该方法,还做了是否异步处理的判断,源码如下:
class BackgroundTask:
    def __init__(
        self, func: typing.Callable[P, typing.Any], *args: P.args, **kwargs: P.kwargs
    ) -> None:
        self.func = func
        self.args = args
        self.kwargs = kwargs
        self.is_async = is_async_callable(func)

    async def __call__(self) -> None:
        if self.is_async:
            await self.func(*self.args, **self.kwargs)
        else:
            await run_in_threadpool(self.func, *self.args, **self.kwargs)

   

 再看回BackgroundTasks类,我们调度了add_task, 其实就是将接收的需执行方法做了"异步化"后塞进tasks任务列表。源码如下:

def add_task(
    self, func: typing.Callable[P, typing.Any], *args: P.args, **kwargs: P.kwargs
) -> None:
    task = BackgroundTask(func, *args, **kwargs)
    self.tasks.append(task)

  

 最后通过__call__ 函数化调度执行循环该tasks任务列表,通过 async 和 await 异步执行调度任务。

后面我也在思考任务为啥可以类似celery任务在后台执行,对主请求无需上下文阻塞等,我想应该是任务调度里的 async 调度 async化的任务,即可避免阻塞等待结果,可放进后台跑,而如果调度任务非异步调度的也做了适配。

如异步化的源码下图:

上面就是先做是否异步调度的状态判断,如果不是异步的,会放进线程池里进行,这样也可实现类似功能。

 

 

上面就是我对fastapi的BackgroundTasks的源码理解,纯粹是个人理解,可能有些文字描述不是很准确,但应该也能理解吧,哈哈哈~

 

标签:__,异步,fastapi,self,args,源码,kwargs,后台任务
From: https://www.cnblogs.com/fengzaoye/p/17617039.html

相关文章

  • 智慧工地源码,基于Vue+Spring Cloud +UniApp框架开发
    源码技术架构:微服务+JavaVue+SpringCloud+UniApp+MySql智慧工地管理平台是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。智慧工地管理平台功能包括:劳务实名制管理系统、监测系统、区域安......
  • Bert Pytorch 源码分析:五、模型架构简图 REV1
    注意力FFNTF块整体架构......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台级联时,通道上传上级宇视平台无法接收的问
    LntonGBS是基于公安部推出的GB/T28181协议开发的视频平台,在安防监控领域应用广泛。下面是一些关于LntonGBS平台的主要特点:GB/T28181协议兼容性、视频直播和转码、云端录像和存储、语音对讲和警告功能、平台级联功能。通过以上的功能和特点,LntonGBS平台能够满足安防监控领域各类场景......
  • 山东布谷科技直播程序源码使用Redis进行服务器横向扩展
    当今,直播程序源码平台作为新媒体时代主流,受到了世界各地人民的喜爱,这也使得直播程序源码平台用户数量的庞大,也难免会出现大量用户同时访问服务器,使服务器过载的情况,当服务器承受不住的时候,可能就会造成服务器崩溃,为了应对这一问题,直播程序源码的开发人员在开发服务器的时候就要去使......
  • 山东布谷科技直播程序源码使用Redis进行服务器横向扩展
    当今,直播程序源码平台作为新媒体时代主流,受到了世界各地人民的喜爱,这也使得直播程序源码平台用户数量的庞大,也难免会出现大量用户同时访问服务器,使服务器过载的情况,当服务器承受不住的时候,可能就会造成服务器崩溃,为了应对这一问题,直播程序源码的开发人员在开发服务器的时候就要去......
  • nmon源码安装使用鲲鹏ARM架构下
     需要在信创环境使用nmon查看系统版本 安装依赖yuminstallwgetncurses-devel-y在准备放置nmon的位置创建一个新的文件夹并进入该文件mkdirnmoncdnmon下载源码相关文件wgethttp://sourceforge.net/projects/nmon/files/lmon16j.cwgethttp://sourceforge.......
  • RTSP/Onvif视频服务器LntonNVR(源码版)视频平台获取录像接口返回精确的录像文件的具体操
    LntonNVR视频平台可实现RTSP/Onvif协议接入设备、实时直播、录像、检索与回放、存储、视频分发等视频能力。在录像功能上,LntonNVR支持7*24小时不间断录像,也可以设定录像计划,对指定时间进行录像,并且支持录像的检索与回放、支持本地录像回放。有用户需要获取LntonNVR平台录像视频指定......
  • RTSP流媒体服务器LntonNVR(源码版)视频平台通过级联到上级云服务器但视频无法播放的问题
    在经过多次的测试后,官方发布的版本可以正常级联。在实际使用过程中,有用户反馈LntonNVR通过国标GB28181协议级联到上级云服务器平台后,出现了上级平台无法播放的问题,需要我们技术人员协助进行排查。从上图我们可以看出,用户的云服务器平台显示是正常的,但是实际点击播放却存在一些问题......
  • 去中心化交易所(DEX)锁仓质押系统开发【源码合约部署】
    锁仓质押系统是一种机制,通过质押资产以获取治理代币奖励。用户提供质押以支持项目,并获得相应的治理代币奖励。这种机制旨在改进现有的金融体系,让个人与个人可以通过区块链直接服务彼此的金融需求,实现去中心化金融(DeFi)的目标。此外,锁仓质押系统也为去中心化交易所(DEX)、金融应用......
  • 山东布谷科技直播系统源码热点分析:不同芯片实现高质量编码与渲染视频的GPU加速功能
    在现代科技的迅猛发展下,直播系统源码平台被开发搭建出来,为人们的生活方式带来了很大的改变,直播系统源码平台的好友、短视频、直播、社区等功能让很多人越来越热衷于去在平台上刷视频、看直播、分享生活。用户的喜爱也督促了直播系统源码平台要往更高质量上发展,图像质量与系统性能......