异步并发怎么做?

异步并发

    • 1、flask的异步并发
      • 问题
      • 解决办法
      • 实现方案
        • (1)flask + 异步视图装饰器
        • (2)WSGI启动服务
    • 2、fastapi异步编程

1、flask的异步并发

问题

  • flask在开发环境下是单线程的,如果某个请求长时间无响应(阻塞),会导致其他请求也无法响应。
  • flask原生并不提供异步并发能力。也就是说,如果使用flask开发的app接口,即使该接口使用了协程异步编程,但在外部并发请求时,flask还是会把这些 "已经异步编程的接口"当成 同步接口执行。

解决办法

  • 1、使用多线程或者多进程的服务器,例如使用 Gunicorn 或者 uWSGI 部署 Flask 或 FastAPI 应用。这些服务器可以同时处理多个请求。
  • 2、使用异步非阻塞的服务器,例如 Tornado 或者 Twisted。这些服务器可以在处理一个请求的时候,如果遇到 IO 阻塞,就先去处理其他的请求,等 IO 完成后再回来继续处理这个请求。
  • 3、使用异步编程,例如 asyncio 或者 gevent。这些库可以让你的代码在遇到 IO 阻塞的时候,自动切换到其他的任务,从而提高整体的并发性能。
    但flask并不真正提供异步运行的能力,推荐支持异步编程的 Web 框架,如fastapi【fastapi官方文档】、aiohttp【aiohttp官方文档】。
    备注: aiohttp既可以做客服端(发起请求),又可以做服务端(接受并处理请求),支持http协议,因此可以做web框架。 但aiohttp比较底层,写起来代码较多。
    客户端-浅度测评:requests、aiohttp、httpx 我应该用哪一个?
    【异步并发编程】使用aiohttp构建Web应用程序
  • 4、对于超时的请求,可以考虑设置一些超时机制,例如使用 future 或者 promise,如果一个请求超时,就直接返回错误,不再等待它完成。这样可以避免一个请求阻塞住整个服务器。

实现方案

(1)flask + 异步视图装饰器

本质: 多线程并发。虽然宏观上看好像是异步并发(单线程的并发)。

虽然asynic await关键字旨在实现同一线程里的并发,但flask并不原生支持这一能力(“不支持”不是说“不能使用这些关键字”)。
所以,同一时间、同一线程、多个请求并发请求时,不管有无asynic await关键字修饰请求接口,flask都是一个一个顺序的、同步处理他们,而不是并发处理。

这里的装饰器实现的功能:
在 Making Flask async and Quart sync, Quart 的作者 PG Jones 给出了一个 Flask 异步化的代码,route 方法可加上 async 关键字@run_async 装饰

当并发请求时,给每个请求开创一个线程单独的处理,这样并发的请求就被放到了多线程里,从宏观上看就是并发了,这样也不会因为某个接口请求阻塞而导致其他接口也无法响应的问题。
但这种异步装饰器,只是宏观上的“像”协程并发(协程:单线程下的并发),其实是多线程并发

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :hippo-ai-py 
@Author  :cf
@Date    :2024/4/2
@Desc    : api公用信息
'''import asyncio
from concurrent.futures import Future, ThreadPoolExecutor
from functools import wrapsfrom flask import Flask, has_request_context, copy_current_request_contextdef run_async(func):'''flask异步视图装饰器。Args:func: 调用的方法Returns:'''@wraps(func)def _wrapper(*args, **kwargs):call_result = Future()def _run():loop = asyncio.new_event_loop()try:result = loop.run_until_complete(func(*args, **kwargs))except Exception as error:call_result.set_exception(error)else:call_result.set_result(result)finally:loop.close()loop_executor = ThreadPoolExecutor(max_workers=1)if has_request_context():_run = copy_current_request_context(_run)loop_future = loop_executor.submit(_run)loop_future.result()return call_result.result()return _wrapperapp = Flask(__name__)async def fetch(url):print(f"{threading.current_thread().name}:{url}")return requests.get(url).textasync def main(t):await asyncio.sleep(t)tasks = [fetch(url) for url in ["https://baidu.com", "https://bing.com", "https://yanbin.blog"]]return await asyncio.gather(*tasks)@app.route("/")
@run_async
async def index():time1 = time.time()responses = await main(3)time2 = time.time()print(f'{threading.current_thread().name}--3:response sizes: {[len(res) for res in responses]},耗时{time2 - time1}s\n')return responses if __name__ == "__main__":# app.run(debug=False, use_reloader=False,threaded=False)  app.run(debug=False, use_reloader=False)
(2)WSGI启动服务

本质: 多线程、多进程的并发。

如何在 uwsgi 配置中传递自定义参数?

2、fastapi异步编程

本质: 协程(单线程)并发。

待续。。。。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试——数据库中的锁升级(Lock Escalation)机制

假设执行下面的sql语句 update tb_user set age age 1;以MySQL为例,按照两阶段锁协议,会先给tb_user加上表意向锁,然后对tb_user的所有行加上行锁,但是当tb_user数据量非常多的时候,频繁的获取行锁会影响性能&#…

idea启动之java.net.BindException: Address already in use: bind

背景: 在win10上安装docker desktop 后,重启电脑,打开idea,提示端口被占用。 一、遇到的问题 打开idea2022.3.3提示以下提示: Internal error. Please refer to https://jb.gg/ide/critical-startup-errorsjava.ne…

C++ | Leetcode C++题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> permuteUnique(vector<int>& nums) {dfs(nums, 0);return res;} private:vector<vector<int>> res;void dfs(vector<int> nums, int x) {if (x num…

冯喜运:【涨久必跌】4.25外汇黄金原油走势分析

【黄金消息面解析】&#xff1a;周三(4月24日)黄金在创下近两年来最大单日跌幅后&#xff0c;持续走低。由于投资者关注缓解中东紧张局势&#xff0c;并有迹象表明美联储将在更长时间内维持较高利率&#xff0c;自2月中旬以来&#xff0c;金价仍上涨约15%&#xff0c;尽管有迹象…

MySQL_day1

目录 [快捷键] # ### part1 # (1) 登录 # (2) 退出 # ### part2 # 查询当前登录用户 # 设置密码 # 去除密码 # ### part3 # 给具体某个ip设置一个账户连接linux # 给具体192.168.126.% 这个网段下的所有ip设置账户 # 给所有ip下的主机设置账户 # ### part4 [必须熟…

CentOS即将停服,国产化系统替代参考

国产化替代CentOS的产品有多个选择&#xff0c;主要包括以下几种&#xff1a; Alibaba Cloud Linux&#xff1a;阿里云提供的Linux操作系统&#xff0c;旨在为用户提供稳定、安全、高性能的云服务器环境。此外&#xff0c;阿里云还发布了“龙蜥”&#xff08;Anolis OS&#x…

软考-系统集成项目管理中级--信息(文档)和配置管理

本章历年考题分值统计(16年11月及以后按新教材考的) 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 本章历年考题及答案解析 12、2018 年下半年第 14题 关于配置管理&#xff0c;不正确的是(14) A、配置管理计划制定时需了解组织结构环境和组织单元之间的联系 B、配置…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

DelphiWebMVC对VUE导出包的支持

MVC框架除了本身对html文件的渲染输出&#xff0c;先开始对Hbuilder或VSCode 开发的VUE项目的导出包&#xff0c;开始支持导出包的部署。 这是一个Hbuilder 的vue 项目&#xff0c;导出包为&#xff1a; 这是一个DelphiWeb项目&#xff0c; 这是DelphiWeb项目的运行目录&#x…

FloodFill算法---DFS

目录 floodfill算法概念&#xff1a; 算法模板套路&#xff1a; 例题1&#xff1a;图像渲染 例题2&#xff1a;岛屿数量 例题3&#xff1a;岛屿的最大面积 例题4&#xff1a;被围绕的区域 floodfill算法概念&#xff1a; floodfill算法是一种常用的图像处理算法&#xf…

Java递归生成树形菜单结构的json

Java递归生成树形菜单结构的json 1.数据class2.获取数据方法3. 组装数据的的递归方法4. 案例5. 结果输出 1.数据class Dept.java public class Dept {/** uuid */private String id;/** 部门名称 */private String name;/** 父id */private String parentId;private List<…

高速AI光模块–通往400G/800G及更高速率

人工智能&#xff08;AI&#xff09;领域对高速数据传输的需求推动了光学技术取得显著进步。本文探讨了实现400G/800G速率的演进历程并展望这些技术在未来能够提供更强大功能。我们深入研究高速400G/800G AI光模块的需求、演变和重要性&#xff0c;展现它们对各个行业的变革性影…

Python 在windows环境下加密文件成.pyd格式

首先 pip install easycython然后打开在要加密的文件同一目录下cmd命令框&#xff0c;命令行里键入 easycython 你要加密的文件.py 最后会在目录下看见有个.pyd的文件&#xff0c;只保留这个文件&#xff0c;剩下的都删了&#xff0c;其他引用该文件的python文件该咋用咋用。…

Vue 3 + Vite项目实战:常见问题与解决方案全解析

文章目录 一、项目使用本地图片打包后不显示1、在html中时候&#xff0c;本地运行和打包后线上运行都ok。2、用动态数据&#xff0c;本地运行ok&#xff0c;打包后线上运行不显示3、适用于处理单个链接的资源文件4、用动态数据且本地和线上访问都可显示 二、使用插件vite-plugi…

leetcode2739--总行驶距离

1. 题意 典型的空瓶换酒问题。 2. 题解 2.1 直接模拟 class Solution { public:int distanceTraveled(int mainTank, int additionalTank) {int ans 0;while (mainTank > 5) {ans mainTank/5*5;int extra min(mainTank/5, additionalTank);mainTank % 5;mainTank e…

element -ui 横向时间轴,时间轴悬浮对应日期

效果&#xff1a; <el-tabs v-model"activeName" type"card" tab-click"handleClick"><el-tab-pane label"周期性巡视" name"zqxxs" key"zqxxs" class"scrollable-tab-pane"><div v-if…

程序员视角下的AIGC技术:现状、挑战与未来展望

在当今科技日新月异的时代&#xff0c;人工智能生成内容(AIGC)技术正在以前所未有的速度改变着内容创作的格局。作为一名程序员&#xff0c;我密切关注这一领域的发展&#xff0c;并试图从技术角度剖析其现状&#xff0c;探讨未来的趋势。 AIGC技术的发展现状 目前&#xff0…

【11-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

vlan的学习笔记2(vlan间通信)

1.使用路由器的物理接口 原理&#xff1a;在二层交换机上配置VLAN&#xff0c;每个VLAN单独使用一个交换机接口与路由器互联。路由器使用两个物理接口&#xff0c;分别作为VLAN 10及VLAN 20内PC的默认网关&#xff0c;使用路由器的物理接口实现VLAN之间的通信。 实验1&#x…

EasyCVR视频汇聚平台无法自动播放视频的原因排查与解决

国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流…