前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >FastAPI 异步后台任务阻塞其他请求如何处理?

FastAPI 异步后台任务阻塞其他请求如何处理?

作者头像
山河已无恙
发布于 2023-11-27 04:56:40
发布于 2023-11-27 04:56:40
1.6K00
代码可运行
举报
文章被收录于专栏:山河已无恙山河已无恙
运行总次数:0
代码可运行

1写在前面


  • 工作中遇到,有大佬做了解答,简单整理
  • 阻塞的主要原因是 网络IO 密集型CPU 密集型是两个不同的概念, ASGI 更多的是面向 网络/IO 密集型的非阻塞处理,不适用 CPU 密集型
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


在使用 FastAPIweb 服务的时候, 使用 BackgroundTasks 执行CPU密集型任务,会阻塞当前 web 服务的所有接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.get('/face_recognition_activated')
async def   face_recognition_activated(level : int,background_tasks: BackgroundTasks,token: bool = Depends(get_current_token)):
    """
    @Time    :   2023/10/20 03:28:11
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   开始进行人脸识别
    """
    # 提取人脸库数据
    
    background_tasks.add_task(face_recognition, data = {
            "dir_name":"A205_20237test4",
            "class_code": "A0205",
            "real_real_id": [2747,2745,345435]
            })
    return {"status": 200,"message": "人脸识别开始了 🚀🚀🚀🚀🚀" }

对应的后台任务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async def face_recognition(c_data):
    """
    @Time    :   2023/10/20 05:09:23
    @Author  :   liruilonger@gmail.com
    @Version :   1.0
    @Desc    :   人脸识别
    """
    logging.info("开始人脸数据库特征提取!")
     ....................
    pbar_i = tqdm(
        range(0, len(face_list)),
        desc="特征载入内存:👀👀👀",
        mininterval=0.001,
        smoothing=0.0001,
        colour='green',
    )
    for idx in pbar_i:
        face_id = face_list[idx]
        face_id = face_id.decode('utf-8')
        face_score_key = class_code_account_period +"_face_score" 
        faces = pkl.rc.zrange(face_score_key + ":" + face_id, 0, -1)
        meta_dates = []
        for hallmark_id in faces:
            face_recognition_key = class_code_account_period + "_face_recognition"
            face_r = pkl.rc.hget(
                face_recognition_key + ":" + face_id, hallmark_id)
            face_path_key = class_code_account_period + ':Path'
            f_path = pkl.rc.hget(face_path_key, face_id)
            
            meta_date = {"hallmark_id": hallmark_id.decode('utf-8'),
                         "face_r": pickle.loads(face_r),
                         "f_path": f_path.decode('utf-8'),
                         "mass": 500,
                         }
            #logging.info(meta_date)
            meta_dates.append(meta_date)
        checks.append({"face_id": face_id, "meta_dates": meta_dates})

    logging.info("构建内存人脸库完成")
    # 开始人脸识别
    logging.info("开始人脸识别..")
    r_p = RedisClient(1)
    logging.info("人脸识别后台任务启动......") # 
    consumer_task = asyncio.create_task(AdafaceFaceIdentification.consumer_facial_feature_clustering(global_object,checks,r_p,class_code_account_period,c_data))
    await asyncio.gather(consumer_task)

对于这种情况,这是因为 对应的 后台任务被定义为 async , 意味着 fastapi 会在 asyncio 事件循环中运行它。并且因为 对应后台任务的某一环节是同步的(即不等待某些 IO或者是网络请求,而是进行计算)只要它正在运行,它就会阻塞事件循环。

这有在涉及异步IO网络操作的情况下,asyncio 才不会阻塞,能够以非阻塞的方式运行,从而充分利用系统资源并提高应用程序的并发性能。

解决这个问题的几种方法:

  • 使用更多的工人(例如 uvicorn main:app --workers 4 )。这将允许最多 4 个 后台任务 并行。
  • 将任务重写为不是 async (即将其定义为 def task(data): ... 等)。然后 starlette 将在单独的线程中运行它。
  • 使用 fastapi.concurrency.run_in_threadpool ,这也将在单独的线程中运行它。像这样:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   from fastapi.concurrency import run_in_threadpool
  async def task(data):
      otherdata = await db.fetch("some sql")
      newdata = await run_in_threadpool(lambda: somelongcomputation(data, otherdata))
      await db.execute("some sql", newdata)
  • 或者直接使用 asynciosrun_in_executor (其中 run_in_threadpool 在后台使用):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import asyncio
async def task(data):
    otherdata = await db.fetch("some sql")
    loop = asyncio.get_running_loop()
    newdata = await loop.run_in_executor(None, lambda: somelongcomputation(data, otherdata))
    await db.execute("some sql", newdata)

  • 自己生成一个单独的线程/进程。例如使用 concurrent.futures
  • 使用更重的东西,如芹菜。(也在 此处 的 fastapi 文档中提到)。

2博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 :)


https://segmentfault.com/q/1010000043296883

https://stackoverflow.com/questions/63169865/how-to-do-multiprocessing-in-fastapi/63171013#63171013


© 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

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

本文分享自 山河已无恙 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
聊聊Transform模型
循环神经网络和长短期记忆网络已经广泛应用于时序任务,比如文本预测、机器翻译、文章生成等。然而,它们面临的一大问题就是如何记录长期依赖。 为了解决这个问题,一个名为Transformer的新架构应运而生。从那以后,Transformer被应用到多个自然语言处理方向,到目前为止还未有新的架构能够将其替代。可以说,它的出现是自然语言处理领域的突破,并为新的革命性架构(BERT、GPT-3、T5等)打下了理论基础。 Transformer由编码器和解码器两部分组成。首先,向编码器输入一句话(原句),让其学习这句话的特征,再将特征作为输入传输给解码器。最后,此特征会通过解码器生成输出句(目标句)。 假设我们需要将一个句子从英文翻译为法文。如图所示,首先,我们需要将这个英文句子(原句)输进编码器。编码器将提取英文句子的特征并提供给解码器。最后,解码器通过特征完成法文句子(目标句)的翻译。
Ryan_OVO
2023/11/05
1.3K0
聊聊Transform模型
【DL】Self-Attention与Transformer
答:编码器-解码器(Encoder-Decoder)模型最初是由Cho等提出应用在机器翻译中。由于在机器翻译中是文本到文本的转换,比如将法语翻译成英语,Sutskever等也称编码器-解码器模型为序列到序列学习(Seq2Seq)。
yuquanle
2020/02/25
1.2K0
从零构建大模型之Transformer公式解读
【引】收到图灵寄来的两本书《大模型应用开发极简入门》和《从零构建大模型》,重新点燃了自己深入理解大模型内部机制的热情,不能只知其然而不知其所以然,于是重温大模型核心的transformer架构, 尝试用25个公式进行解读,遂成此文。
半吊子全栈工匠
2025/04/14
9K0
从零构建大模型之Transformer公式解读
图解Transformer(完整版)!
审稿人:Jepson,Datawhale成员,毕业于中国科学院,目前在腾讯从事推荐算法工作。
Datawhale
2020/11/06
1.7K0
图解Transformer(完整版)!
BERT大火却不懂Transformer?读这一篇就够了
编者按:前一段时间谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。在本文中,我们将研究Transformer模型,把它掰开揉碎,理解它的工作原理。
大数据文摘
2019/01/23
1.1K0
BERT大火却不懂Transformer?读这一篇就够了
广告行业中那些趣事系列4:详解从配角到C位出道的Transformer
摘要:上一篇广告行业中那些趣事系列3:NLP中的巨星BERT,从理论的角度讲了下NLP中有里程碑意义的BERT模型。BERT具有效果好和通用性强两大优点,其中效果好最主要的原因就是使用了Transformer作为特征抽取器。本篇主要详解下这个从配角到C位出道的Transformer,主要从宏观和微观的角度分析Transformer,讲下它的核心注意力机制Attention,然后以翻译任务举例讲下Transformer是如何进行工作的。
数据拾光者
2022/05/05
2820
广告行业中那些趣事系列4:详解从配角到C位出道的Transformer
图解Transformer — Attention Is All You Need
2017年谷歌大脑在《注意力是你所需要的一切》一文中解释了Transformer 。本文是随着自然语言处理领域的发展而来的。许多最先进的NLP模型都是以Transformer 为基础建立的。
deephub
2021/01/25
9750
AI生成中Transformer模型
在深度学习中,有很多需要处理时序数据的任务,比如语音识别、文本理解、机器翻译、音乐生成等。
Dlimeng
2023/12/20
7800
AI生成中Transformer模型
【调研】详解Transformer结构——Attention Is All You Need
        Transformer是一个完全依赖自注意力的面向sequence to sequence任务的NLP模型,由谷歌大脑在17年的论文《Attention is all you need》中首次提出。它抛弃了传统的CNN和RNN神经网络,整个网络结构完全由Attention机制以及前馈神经网络组成,它解决了RNN长期依赖和无法并行化以及CNN缺失全局特征等问题。(尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。)
小锋学长生活大爆炸
2022/10/28
1.4K0
神经网络算法 —— 一文搞懂Transformer !!
本文将从 Transformer的本质、Transformer的原理 和 Transformer架构改进三个方面,搞懂Transformer。
JOYCE_Leo16
2024/03/22
34.5K0
神经网络算法 —— 一文搞懂Transformer !!
一文理解透Transformer
"Attention Is All You Need"是一篇于2017年发表的开创性论文,首次介绍了Transformer模型。
double
2024/04/11
2.6K0
一文理解透Transformer
百分点认知智能实验室出品:机器翻译是如何炼成的(下)
在“机器翻译是如何炼成的(上)”的文章中,我们回顾了机器翻译的发展史。在本篇文章中,我们将分享机器翻译系统的理论算法和技术实践,讲解神经机器翻译具体是如何炼成的。读完本文,您将了解:
数据猿
2020/03/05
6420
原创 | 一文读懂Transformer
作者:陈之炎 本文约3500字,建议阅读7分钟Transformer 是第一个完全依赖于自注意力机制来计算其输入和输出的表示的转换模型。 主流的序列到序列模型是基于编码器-解码器的循环或卷积神经网络,注意力机制的提出,优化了编解码器的性能,从而使得网络性能达到最优。利用注意力机制构建出新的网络架构Transformer, 完胜了循环或卷积神经网络。Transformer 是第一个完全依赖于自注意力机制来计算其输入和输出的表示的转换模型。Transformer可以并行训练,训练时间更短。 1 Transfor
数据派THU
2022/07/12
4.6K0
原创 | 一文读懂Transformer
十分钟了解Transformers的基本概念
多年来,我们一直在使用RNN,LSTM和GRU解决顺序问题,您突然希望我们将其全部丢弃吗?嗯,是!!所有这三种架构的最大问题是它们进行顺序处理。而且它们也不擅长处理长期依赖关系(即使使用LSTM和GRU的网络)。Transformers 提供了一种可并行处理顺序数据的方式,因此,它不仅比以前的体系结构快得多,而且在处理长期依赖性方面也非常出色。
deephub
2020/11/02
1.2K0
十分钟了解Transformers的基本概念
保姆级教程:硬核图解Transformer | 留言送书
再比如 OpenAI 的 DALL·E,可以魔法一般地按照自然语言文字描述直接生成对应图片!
磐创AI
2021/01/27
1.2K0
保姆级教程:硬核图解Transformer | 留言送书
小白看得懂的图解Transformer
Trasnformer可以说是完全基于自注意力机制的一个深度学习模型,因为它适用于并行化计算,和它本身模型的复杂程度导致它在精度和性能上都要高于之前流行的RNN循环神经网络
算法进阶
2023/10/23
2K0
小白看得懂的图解Transformer
【NLP】Transformer理论解读
Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,目前已经在目标检测、自然语言处理、时序预测等多个深度学习领域获得了应用,成为了新的研究热点。
zstar
2022/09/16
6380
【NLP】Transformer理论解读
Transformer (Attention is all you need) 详解
在之前的博客中有简单讲到Transformer,这篇博客将会专门详细的一起看看内部的计算与实现。
大鹅
2021/08/26
2.7K1
谷歌、DeepMind和OpenAI都在用的Transformer是如何工作的?| 干货
不论是各处霸榜的谷歌BERT、OpenAI最近的强大NLP模型GPT-2,还是DeepMind击败星际2顶尖职业玩家的AlphaStar,背后都有 Transformer的身影。
量子位
2019/04/23
6150
谷歌、DeepMind和OpenAI都在用的Transformer是如何工作的?| 干货
Attention Is All You Need
主流的Seq-Seq的模型通常采用RNN或者是CNN,一般在网络结构中都会用到encoder和decoder, 效果比较好的模型会通过attention(注意力机制)连接encoder和decoder。但是这种网络结构也存在一些问题:
张凝可
2019/08/22
6510
推荐阅读
相关推荐
聊聊Transform模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档