Flask 线上高并发部署方案实现

news2024/9/23 11:17:57

目录

1、Flask默认多线程执行

2、使用gevent.pywsgi实现

3、是用uWSGI服务器实现

1、Flask默认多线程执行

前言:在Flask的较早版本中,默认并不支持多线程模式。然而,从Flask 0.9版本开始,引入了多线程模式的支持,并且在后续版本中逐渐成为默认设置。到了Flask 1.0版本,多线程模式已经被明确设定为默认行为。也就是说现在的Flask版本都是默认支持多线程的。

1、我们可以测试一下现在的Flask是不是以多线程的方式执行的。

【测试环境】

  • Flask:2.3.2
  • python:3.9.10

示例代码:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    time.sleep(3)
    return "hello world"

if __name__ == '__main__':
    app.run(debug=True)
  • 我们进入到app.run()函数的源码查看,它的参数描述是怎么样的:

所以通过上面源码我们可以知道,现在是支持多线程的,且参数threaded默认True,也就是我们无法通过app.run()这个入口通过设置threaded为False来使用单线程,但是我们可以改源码。

1、现在我们通过JMeter来发起请求,看看是不是并发的。

  • 1、线程数设置为2

  • 2、HTTP请求配置如下:
  • 3、再添加一个结果查看树,来查看运行结果

  • 4、发送请求,查看结果

从上面结果可以看出两个线程的响应时间是3秒左右,可以得出确实是并发执行的。

2、那我们再看看把threaded参数改为False的情况

  • 1、同样的发送请求,查看结果

从上面结果可以看出线程1的响应时间是3秒左右,而线程2的响应时间是5.5左右,可见线程2是等待线程1执行完了再执行的,得出结论两个线程是串行的。

总结:对于比较小型的项目在生产环境中部署没有问题,实际应用中还是应该根据实际的项目,进行压力测试找到对应的系统容量;但是对于一些大型的项目,并发量比较高的场景,继续使用默认的配置就不合适了,这时候需要使用专门的Web服务器,如使用uWSgi,Nginx,Docker容器等部署方式解决高并发的问题。下面介绍一些常用的手段。

2、使用gevent.pywsgi实现

gevent.pywsgi.WSGIServer: 是 Gevent 库中的一个 WSGI 服务器实现,主要用于提供异步、协程支持的 Web 服务器功能。它与传统的 WSGI 服务器(如 werkzeug.serving.WSGIRequestHandler)不同,具有以下几个优势和适用场景:

作用与优势

1、异步处理请求:

  • Gevent 使用绿色线程(协程)来处理 I/O 操作,这使得它在处理大量并发请求时表现得更加高效。
  • 由于使用了事件驱动和协程模型,Gevent 可以在等待 I/O 操作完成时继续处理其他任务,从而减少了阻塞和等待时间。

2、高并发处理能力:

  • WSGIServer 可以处理大量的并发连接,而不会因为线程或进程的上下文切换而导致性能下降。这对于需要处理大量并发请求的应用非常有用,例如实时聊天应用或高流量的 API 端点。

3、轻量级

  • Gevent 的绿色线程比传统的操作系统线程要轻量,内存开销小,创建和销毁速度快。这使得它能够支持更多的并发任务而不消耗过多的资源。

4、简化协程编程:

  • Gevent 提供了简单的协程编程接口,可以很容易地使用 gevent.sleep() 等方法来编写异步代码,而不需要深入了解底层的异步 I/O 细节。

5、与现有代码兼容:

  • Gevent 可以与现有的同步代码兼容,通过猴子补丁(monkey patching)来让标准库的同步操作支持异步执行。这样,你可以在不完全重写代码的情况下引入异步特性。

使用场景
1、高并发 Web 应用:

  • 适用于需要处理大量并发请求的 Web 应用,如大型 API 服务或高流量的 Web 服务器。

2、实时应用:

  • 例如聊天应用、实时数据推送服务、在线游戏等,这些应用需要处理大量并发连接和实时通信。

3、长连接服务:

  • 对于需要保持长时间连接的服务,如 WebSocket 服务器,Gevent 的异步处理特性能够提供更好的性能和扩展性。

4、I/O 密集型任务:

  • 适用于那些主要由 I/O 操作(如网络请求、文件读取等)组成的应用,这类任务通常会受益于 Gevent 的异步处理能力。

代码示例:

from flask import Flask
from gevent import monkey
from gevent.pywsgi import WSGIServer

app = Flask(__name__)

@app.route('/')
def index():
    time.sleep(1)
    return "hello world"

monkey.patch_all()
if __name__ == '__main__':
    # app.run(debug=True)
    http_server = WSGIServer(('0.0.0.0', 5000), app)
    http_server.serve_forever()

做个简单压力测试看看相比于上面默认情况的性能情况:

  • 1、从下图可以看出使用了WSGIServer的明显QPS要比默认情况的要高;
  • 2、默认情况下的错误率达到了17.3%,使用了WSGIServer的错误率为0

综上所述:使用了WSGIServer的性能明显优于默认使用多线程的情况

3、是用uWSGI服务器实现

注意:uwsgi 主要是为 Unix/Linux 系统设计的,并不直接在 Windows 上支持。

1、安装uWSGI【注意:这里是在Linux环境下】:

pip install uwsgi

2、创建uWSGI配置文件:

你可以创建一个INI格式的配置文件,比如uwsgi.ini,并在其中指定Flask应用的设置。一个基本的配置文件示例如下:

[uwsgi]  
module = your_flask_app:app  
master = true  
processes = 4  
socket = 0.0.0.0:8000  
chmod-socket = 660  
vacuum = true  
die-on-term = true

在这个配置文件中:

  • module 指定了你的Flask应用的模块和变量名(通常是app)。
  • master 启用了主进程管理。
  • processes 设置了工作进程的数量。
  • socket 定义了uWSGI服务器监听的地址和端口。
  • chmod-socket 更改了socket的权限。
  • vacuum 在服务器关闭时清理socket和PID文件。
  • die-on-term 在接收到SIGTERM时立即退出。

3、启动uWSGI服务器:

使用uWSGI的配置文件启动服务器:

uwsgi --ini uwsgi.ini

这将根据uwsgi.ini文件中的设置启动uWSGI服务器,并运行你的Flask应用。

4、访问应用:
打开浏览器,访问http://localhost:8000(或者你在配置文件中指定的其他地址和端口),你应该能够看到你的Flask应用正在运行。

5、停止uWSGI服务器:

要停止uWSGI服务器,你可以使用以下命令(假设你知道uWSGI主进程的PID):

kill -SIGTERM <uwsgi_pid>

或者,如果你使用的是uwsgi --ini方式启动的,并且想要优雅地停止服务器,你可以发送SIGINT信号(通常是Ctrl+C)到你启动uWSGI的终端会话。

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

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

相关文章

红酒与旅游攻略:旅行途中的风味之选

在旅行的道路上&#xff0c;我们总是渴望寻找那些能够触动心灵、留下深刻记忆的不同体验。而红酒&#xff0c;作为一种充满韵味和故事的饮品&#xff0c;无疑是旅行途中的风味之选。洒派红酒&#xff08;Bold & Generous&#xff09;&#xff0c;这款定制红酒&#xff0c;以…

基于xilinx IP的频域脉冲压缩算法的实现和matlab仿真

工具&#xff1a;matlabR2021b&#xff0c;vivado2018.3. 脉冲压缩的原理 脉冲压缩实际上就是对接收信号进行匹配滤波处理。根据发射的波形不同&#xff0c;脉冲压缩时选择不同的匹配滤波器系数。 数字脉冲压缩的实现方式有两种: 一是时域卷积法; 二是频域乘积法。依据傅里叶…

智能化包括自动化与非自动化

智能化通常指的是系统或设备具备智能功能&#xff0c;以提高其自主性和效率。智能化可以分为自动化与非自动化两大类&#xff0c;每一类都有其独特的特点和应用场景。 一、自动化 自动化指的是系统能够在无需人为干预的情况下完成任务或操作。自动化系统通常依赖于预设的规则、…

基于LangChain手工测试用例转接口自动化测试生成工具!

接口自动化测试用例是一个老生常谈的问题&#xff0c;在未引入人工智能之前&#xff0c;也有非常多的生成方案&#xff0c;比如如下所示&#xff0c;通过har生成接口自动化测试用例&#xff1a; 但是以上的生成方式依然是有一些弊端&#xff0c;比如 har 本身虽然能表述一定的接…

铁威马NAS教程丨TOS应用中心无法下载应用,显示0%或“准备中“?

故障排除 适用机型 所有 TNAS型号 原因分析 该现象通常是网络配置不正确或文件系统异常引起&#xff1a; 1.获取不到网关&#xff0c;状态栏甚至显示红色的“未连接” 2.路由器自动分配的DNS无法解析出下载服务器的域名 3.文件系统为只读文件系统 解决方法 1.重新获取…

中间件|day1.Redis

Redis 定义 Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c; 散列&#xff08;hash…

TongHttpServer安装部署

TongHttpServer安装部署 毫无背景不是你堕落的理由&#xff0c;而更应该是你前进的动力。你该花时间思考&#xff0c;如何打好一副烂牌&#xff1b;而不是抱怨命运&#xff0c;或者干脆撕牌。 部署环境 TongHttpServer V6.0是一款轻量级负载均衡软件&#xff0c;支持 0SI 四层…

【瑞芯微RV1126(深度学习模型部署)】部署自己训练的yolov8-seg,实现足型检测!

前言 如果按照本系列第一篇博客那样交叉编译了opencv&#xff0c;那本文有些步骤就不用了&#xff0c;比如交叉编译工具链的下载&#xff0c;所以自己斟酌步骤。 本系列第一篇&#xff1a;https://blog.csdn.net/m0_71523511/article/details/139636367 本系列第二篇&#xff…

Android-RK356x GT9XX多点触控设置为单点触控的方法

本文基于RK356x Android11系统描述GT9XX驱动芯片由多点触摸改为单点触摸功能。本次介绍的是触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;Purple Pi OH是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大…

大模型应用——智能客服、机器翻译、文本生成、情感分析、问答系统、金融行业、电商、教育、医疗健康、个性化推荐、图像处理、视频处理、自动驾驶

大模型在各行业中的应用 1. 智能客服 应用场景&#xff1a;大模型可以作为智能客服系统的核心&#xff0c;提供自然流畅的对话体验&#xff0c;解答用户问题、推荐服务或产品&#xff0c;显著提升客户满意度。 效果&#xff1a;通过自然语言处理技术&#xff0c;大模型能够准…

深度学习每周学习总结N7:seq2seq翻译实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 使用seq2seq实现文本翻译一、前期准备工作1. 搭建语言类2. 文本处理函数3. 文件读取函数 二、Seq2Seq 模型1. 编码器&#xff08;Enc…

MySQL基础架构和日志系统

MySQL基础架构和日志系统 1&#xff0c;逻辑架构图1.1 连接器1.2.1 查询缓存1.2.2 分析器1.3 优化器1.4 执行器 2&#xff0c;日志系统2.1 redo log&#xff08;重做日志&#xff09;2.2 binlog&#xff08;归档日志&#xff09;2.3 两阶段提交2.3.1 崩溃恢复机制是什么&#x…

ai智能改写工具,一键智能改写文案效率高

在当今这个信息如洪流般涌来的时代&#xff0c;文案创作的重要性不言而喻。无论是为了吸引读者的目光、还是传达准确的信息&#xff0c;一篇精彩的文案都能发挥巨大的作用。而在这一过程中&#xff0c;ai智能改写工具宛如一颗璀璨的新星&#xff0c;以其独特的魅力和强大的功能…

Datawhale X 魔搭 AI夏令营第四期魔搭-AIGC文生图方向Task3笔记

Task3&#xff1a;进阶上分-实战优化 part1&#xff1a;工具初探一ComfyUI应用场景探索 ComfyUI概述 ComfyUI是一个功能强大、高度模块化的Stable Diffusion图形用户界面和后端系统&#xff0c;它允许用户通过链接不同的节点来构建复杂的图像生成工作流程。这些节点可以包括各…

Windows设置定时任务进行oracle数据库备份

先找到“定时任务计划” 方法1.开始->所有程序->附件->系统工具->定时任务计划 方法2:控制面板->输入计划 进行查询操作 名称随便定&#xff0c;点击下一步 下一步 设置每天的定时执行时间&#xff0c;点下一步 点下一步选择启动程序&#xff0c;点下一步 点…

Bruno API 工具

Bruno 是Postman 和Insomnia 的开源桌面替代品&#xff0c;用于 API 的测试、开发和调试。它将测试集合保存在本地&#xff0c;因此可以使用 Git 或其他版本控制工具来进行协作。 下载地址: https://www.usebruno.com/downloads 功能 1. 左边菜单 Collections Create Collec…

Unity 资源 之 功夫动画包(Kung-Fu animations),极致动作体验

震撼来袭&#xff01;Unity 功夫动画包&#xff0c;极致动作体验 一、前言二&#xff0c;资源包内容三、免费获取资源包 一、前言 这个动画包简直让人惊叹不已&#xff0c;它包含了多达 140 多种不同的动画&#xff01;想象一下&#xff0c;如此丰富的选择&#xff0c;几乎涵盖…

ChatGLM-4-9b-chat本地化|天翼云GPU上vLLM本地部署开源模型完整攻略

“ 拥有一个私有化的领先国产开源大模型&#xff1f;本文详细介绍了如何在天翼云GPU上使用vLLM部署ChatGLM-4-9b-chat本地化模型的完整攻略&#xff0c;助您快速上手。” 01 — vLLM 本来打算用ollama在GPU服务器上部署开源模型GLM4&#xff0c;在之前文章有部署教程&#xff1…

中央空调能量型计费系统,实现节能降耗

中央空调能量型计费系统是一种先进的计费方式&#xff0c;旨在通过科学、合理、公平地分摊中央空调使用费用&#xff0c;促进能源的有效利用和节能降耗。上海智能医疗创新示范基地使用的空调系统正是中央空调能量型计费系统 项目&#xff1a;上海智能医疗创新示范基地 项目情况…

【通信理论知识】数据传送的方式:串/并行;传输方向:单工、半/全双工;传输方式:同步/异步

通信协议与接口知识参考文章&#xff1a; 【通信理论知识】数据传送的方式&#xff1a;串/并行&#xff1b;传输方向&#xff1a;单工、半/全双工&#xff1b;传输方式&#xff1a;同步/异步 【串口通信详解】USART/UART、RS232、RS485标准接口与协议特点解析 【同步串行通信接…