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

目录

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 Flaskapp = 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 WSGIServerapp = 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.rhkb.cn/news/402425.html

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

相关文章

【自动驾驶】ROS中的TF坐标变换(一):静态坐标变换

目录 引子ros中的右手坐标系补充&#xff1a;欧拉角及四元数理解旋转平移操作复合操作 运行坐标变换的例子坐标转换 静态坐标变换-发布坐标系信息创建功能包 静态坐标变换-订阅坐标系信息添加cpp订阅者主文件修改cmakelist文件编译报错的解决方案运行程序进行测试 引子 机器人…

【MySQL数据库】单机、集群、分布式的区别

单机、集群和分布式是计算机系统中三种不同的架构模型,它们在资源管理、任务执行和性能优化方面有显著区别。 图片来源 1. 单机(Standalone) 单机指的是单一计算机系统,即所有的计算任务和数据都在一台计算机上处理。单机系统的特点包括: 硬件限制:受限于单台机器的计…

Visual Studio 2022 无法打开源文件atlimage.h

最近在搞tcp socket 通信demo&#xff0c;网上抄了一下源码&#xff08;代码参考&#xff1a;C中的Socket编程使用协议发送图片_快速传输 照片 c-CSDN博客&#xff09;&#xff0c;还没开始编译就提示 无法打开源文件atlimage.h&#xff0c;全局搜了一下没有这个文件&#xff0…

JSON Web Token (JWT): 理解与应用

JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于在各方之间以JSON对象的形式安全地传输信息。JWT通常用于身份验证和授权目的&#xff0c;因为它可以使用JSON对象在各方…

Unity开发抖音小游戏广告部分接入

Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容&#xff0c;因为要接入广告&#xff0c;所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…

Linux网络编程—socket、bind

一、socket创建套接字 socket是用来创建网络通信或本地通信的套接字&#xff0c;跟文件有关&#xff1a;告诉系统&#xff0c;PCB&#xff08;进程控制块&#xff09;控制的数据应该向哪个套接字写入、或读取&#xff1b;这个套接字是在TCP/IP协议下运行的 #include <sys/t…

选择排序(附动图)

1.思路 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 1.1双向选择排序&#xff08;升序&#xff09; 头尾指针&#xff08;索引&#xf…

初识C++

一、C的由来 C的起源可以追溯到1979年&#xff0c;当时Bjarne Stroustrup(本贾尼斯特劳斯特卢普&#xff0c;这个翻译的名字不同的地方可能有差异)在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务&#xff0c;特别是模拟和操作系统的开发⼯作&…

涉案财物管理系统DW-S405|实现人员随身物品智能化管理

涉案财物管理系统DW-S405系统基于物联网技术规范涉案财物管理流程&#xff0c;确保涉案财物的安全性、完整性和合法性&#xff1b;可以提高办案效率&#xff0c;减少办案成本&#xff0c;实现资源共享。 财物管理 管理员可通过个人账号和指纹验证两种登录方式进入财物管理系统…

1. 数据结构——顺序表的主要操作

1. 内容 顺序表的初始化、插入、删除、按值查找、输出以及其时间复杂度的计算。 2.代码 #include<stdio.h> #include<stdlib.h> //函数结果状态代码 #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define MAXSIZE 100typedef int ElemType; //顺序表每个…

使用Nexus搭建Maven私服仓库

一、私服仓库简介 在Java的世界中&#xff0c;我们通常使用Maven的依赖体系来管理构件&#xff08;artifact&#xff0c;又称为二方库或三方库&#xff09;的依赖&#xff0c;Maven仓库用于存储这些构件。一般的远程仓库&#xff08;比如Maven Central&#xff09;只提供下载功…

OpenCV Python 图像处理入门

OpenCV入门 OpenCV&#xff1a;轻量、高效、开源。最广泛使用的计算机视觉工具。 下面涉及图片的读取&#xff0c;RGB彩色通道&#xff0c;区域裁剪&#xff0c;绘制图形和文字&#xff0c;均值滤波&#xff0c;特征提取&#xff0c;模板匹配&#xff0c;梯度算法&#xff0c…

获奖方案|趋动科技:资源池化释放AI算力价值

“据统计&#xff0c;GPU的平均利用率不超过30%&#xff0c;会产生巨大的算力资源浪费。我们用软件定义的方式通常可以把用户GPU的利用率提升3-8倍&#xff0c;甚至可以到10倍。” 这是算力池化软件公司趋动科技援引行业报告数据并结合自身企业最佳实践经验给出的最新数据。通…

在 SOCKS 和 HTTP 代理之间如何选择?

在 SOCKS 和 HTTP 代理之间进行选择需要彻底了解每种代理的工作原理以及它们传达的配置。只有这样&#xff0c;您才能轻松地在不同类型的代理之间进行选择。 本文概述了 HTTP 和 SOCKS 代理是什么、它们如何运作以及它们各自带来的好处。此外&#xff0c;我们将比较这两种代理类…

Java算法解析一:二分算法及其衍生出来的问题

这个算法的前提是&#xff0c;数组是升序排列的 算法描述&#xff1a; i和j是指针可以表示查找范围 m为中间值 当目标值targat比m大时&#xff0c;设置查找范围在m右边&#xff1a;i m-1 当目标值targat比m小时&#xff0c;设置查找范围在m左边&#xff1a;j m1 当targat的…

数据结构第一天

数据结构基础知识 1.1 什么是数据结构 数据结构就是数据的逻辑结构以及存储操作 (类似数据的运算) 数据结构就教会你一件事&#xff1a;如何更有效的存储数据 1.2 数据 数据&#xff1a;不再是单纯的数字&#xff0c;而是类似于集合的概念。 数据元素&#xff1a;是数据的基本单…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数&#xff0c;该函数接受三个参数&#xff1a;输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

优先级队列的实现

什么是优先级队列 优先级队列是一种特殊的数据结构&#xff0c;它类似于队列或栈&#xff0c;但是每个元素都关联有一个优先级或权重。在优先级队列中&#xff0c;元素的出队顺序不是简单地按照它们进入队列的先后顺序&#xff08;先进先出&#xff0c;FIFO&#xff09;&#…

虚幻5|角色武器装备的数据库学习(不只是用来装备武器,甚至是角色切换也很可能用到)

虚幻5|在连招基础上&#xff0c;给角色添加武器并添加刀光|在攻击的时候添加武器并返回背后&#xff08;第一部分&#xff0c;下一部分讲刀光&#xff09;_unreal 如何给角色添加攻击-CSDN博客 目的&#xff1a;捡起各种不同的武器&#xff0c;捡起的武器跟装备的武器相匹配 …

练习:python条件语句、循环语句和函数的综合运用

需求描述&#xff1a; 期望输出效果&#xff1a; 练习成果&#xff1a; #简单的银行业务流程 many 50000 def main_menu():print("----------主菜单----------"f"\n{name}您好&#xff0c;欢迎来到ATM&#xff0c;请选择操作&#xff1a;""\n查询余…