Flask学习笔记(2)应用部署

这篇具有很好参考价值的文章主要介绍了Flask学习笔记(2)应用部署。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  本文将介绍如何部署Flask应用。
  部署Flask应用,主要是要运用多线程与多进程,提高接口的并发能力。我们以下面的Python代码(server.py)为例进行演示:

# -*- coding: utf-8 -*-
import time
import datetime
from flask import Flask, jsonify

app = Flask(__name__)


@app.route('/')
def hello_world():
    time.sleep(15)
    return 'Hello World!'


@app.route('/index')
def beijing():
    return 'Shanghai'


@app.route('/tell_time')
def tell_time():
    start_time_desc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    time.sleep(5)
    end_time_desc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    return jsonify({"start_time_desc": start_time_desc, "end_time_desc": end_time_desc})


@app.route('/tell_time/<int:_id>', methods=['GET'])
def hello_index(_id):
    start_time_desc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    time.sleep(5)
    end_time_desc = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    return jsonify({"id": _id, "start_time_desc": start_time_desc, "end_time_desc": end_time_desc})


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000, threaded=False)

在上述程序中,一共有四个API接口,描述如下:

  • 接口1:/, 功能为睡眠15s,然后输出Hello World!
  • 接口2:/index,功能为输出Shanghai
  • 接口3:/tell_time,功能为睡眠5s,输出开始、结束时间字典
  • 接口4:/tell_time/<int: _id>,以后缀_id区分url,功能同上一个接口。

  如果我们使用python3 server.py,那么该应用部署场景为单线程,即接口之间存在阻塞,也就是说,当我们访问一个耗时的接口的同时,再调用其它接口会被阻塞住,影响这些接口的正常调用。在这个例子中,当我们访问接口1的同时访问接口2,会存在阻塞,如下图:
Flask学习笔记(2)应用部署,Flask,flask
  接下来,我们将介绍三种Flask的部署方式,避免上述的接口阻塞问题,提高接口的并发能力。
  本文使用的Flask版本为2.3.2。

设置多线程或多进程

  在Flask的应用运行时,app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。

  1. threaded : 多线程支持,默认为True,即开启多线程;
  2. processes:进程数量,默认为1.

在Flask版本2.3.2中,threaded默认值为True,但在较早的版本中默认值为False。
  我们在app.run()中将threaded=True或者不写,则该应用采用多线程部署,代码调整如下:

	app.run(host="0.0.0.0", port=5000, threaded=True)

此时,当我们访问接口1的同时访问接口2,不会存在阻塞,如下图:
Flask学习笔记(2)应用部署,Flask,flask
  注意,这里千万不要用浏览器来做实验,两次请求都是相同的url,浏览器可能会进行优化导致两次请求使用相同的socket连接。
  我们以接口3为例,在Chrome浏览器中同时访问http://127.0.0.1:5000/tell_time,结果如下:
Flask学习笔记(2)应用部署,Flask,flask
但当我们换成接口4时,接口就不存在阻塞了,如下图:
Flask学习笔记(2)应用部署,Flask,flask

使用gevent模块

  gevent是一种协程的Python网络库,基于greenlet封装了libevent事件循环的高层同步API。它让我们在不改变编程习惯的同时,用同步的方式写异步I/O的代码。使用gevent编程性能确实要比用传统的线程高。后续我们有机会再单独介绍gevent模块。
  在Flask的部署场景中,在引入gevent 前,可以在程序最开始执行的位置引入猴子补丁gevent.monkey,这能修改 python默认的 IO 行为,让标准库变成协作式的 API。示例代码如下:

from gevent import pywsgi
from gevent import monkey
monkey.patch_all()  # 打上猴子补丁

from flask import flask
...

if __name__ == '__main__':
    app.debug = True
    server = pywsgi.WSGIServer(('127.0.0.1', 5000), app)
    server.serve_forever()

使用gunicorn模块

  Gunicorn是一个Python的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者负载均衡(如 AWS ELB)和一个 web 应用(比如 Django或者Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,既支持eventlet也支持greenlet。
  通常,我们在使用gunicorn模块部署Flask应用时,会结合配置文件一起使用,比如下面的gunicorn配置文件(gunicorn_config.py):

# -*- coding: utf-8 -*-
# gunicorn + gevent 的配置文件
import multiprocessing

timeout = 600
debug = False

# 预加载资源
preload_app = True
# 绑定 ip + 端口
bind = "0.0.0.0:5000"
# 进程数 = cup数量 * 2 + 1
# workers = multiprocessing.cpu_count() * 2 + 1
workers = 2

# 线程数 = cup数量 * 2
# threads = multiprocessing.cpu_count() * 2
threads = 5

# 等待队列最大长度,超过这个长度的链接将被拒绝连接
backlog = 2048

# 工作模式--协程
worker_class = "gevent"

# 最大客户客户端并发数量,对使用线程和协程的worker的工作有影响
# 服务器配置设置的值  1200:中小型项目  上万并发: 中大型
# 服务器硬件:宽带+数据库+内存
# 服务器的架构:集群 主从
worker_connections = 1200

# 进程名称
proc_name = 'gunicorn.pid'
# 进程pid记录文件
pidfile = 'app_run.log'
# 日志等级
loglevel = 'debug'
# 日志文件名
logfile = 'debug.log'
# 访问记录
accesslog = 'access.log'
# 访问记录格式
access_log_format = '%(h)s %(t)s %(U)s %(q)s'

部署的命令为:gunicorn -c gunicorn_config.py server:app。该部署方式采用了多线程+多进程的方式,同时配置可调节,适用于高并发的场景。

压力测试

  我们对接口/tell_time的两种部署方式:采用多线程部署(方式一)和采用gunicorn部署(方式三)进行压力测试,使用工具为jmeter。
  在jmeter中,我们设置1秒钟发送5000个用户请求/tell_time接口,轮次为1,如下图:
Flask学习笔记(2)应用部署,Flask,flask
  使用第一种部署方式(在app.run()中设置threaded为True),测试结果如下:
Flask学习笔记(2)应用部署,Flask,flask
  使用第三种部署方式(使用gunicorn,CPU核数为4,设置workers=9, threads=8),测试结果如下:
Flask学习笔记(2)应用部署,Flask,flask
可以看到,HTTP请求的成功数量是第三种部署方式较多,吞吐量也较多,由此可见,第三种部署方式的高并发性能优于第一种部署方式。

总结

  本文主要介绍了三种常见的高并发部署Flask应用的方式,希望读者能在实际工作中多多实践,提升工作技能~文章来源地址https://www.toymoban.com/news/detail-520808.html

到了这里,关于Flask学习笔记(2)应用部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot+Flask+Neo4j+Vue2+Vuex+Uniapp+Mybatis+Echarts+Swagger+JWT+Nginx+VueRouter综合项目学习笔记【包括项目部署】

    项目访问入口 Neo4j高性能图数据库从入门到实战 教程博客:Neo4j 开启命令 医学知识图谱问答系统 neo4j知识图谱 Vue+flask 中药中医方剂大数据可视化系统 ECharts数据可视化项目、 D3js: 数据可视化入门D3.js 展示地址:数据可视化 子绝父相 立即执行函数(function(){})(); ECharts官网:

    2024年02月03日
    浏览(42)
  • Flask学习笔记_异步论坛(四)

    flask 系列的代码笔记都放在了 仓库。 生成本环境的requirements.txt文件 在app.py文件的目录下 celery(分布式任务队列/任务调度器)和redis(内存数据库)的教程和安装步骤可以参考学习。Broker和Backend都用redis存储。 pip install gevent pip install redis pip install hiredis 启动celery flask-cachi

    2024年02月14日
    浏览(42)
  • Flask学习笔记_异步CMS(五)

    这篇博客是上一篇的后台,使用Vue3+VueCli+VueRouter+Vuex搭建,这个是 学习手册,具体的代码放到了 仓库。 nvm(Node Version Manager)是一个用来管理node版本的工具。首先去nvm下载,然后安装,环境变量自动添加,如果没有手动添加。nvm version查看安装好的版本有哪些。 常用命令

    2024年02月14日
    浏览(32)
  • 深度学习模型部署——Flask框架轻量级部署+阿里云服务器

    ​因为参加一个比赛,需要把训练好的深度学习模型部署到web端,第一次做,在网上也搜索了很多教程,基本上没有适合自己的,只有一个b站up主讲的还不错 https://www.bilibili.com/video/BV1Qv41117SR/?spm_id_from=333.999.0.0vd_source=6ca6a313467efae52a28428a64104c10 https://www.bilibili.com/video/BV1Qv41117

    2024年02月07日
    浏览(78)
  • 本地部署Python Flask并搭建web问答应用程序框架实现远程访问

    Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程我们使用Python Flask搭建一个web问答应用程序框架,并结合cpolar内网穿透工具将我们的应用程序发布到公共网络上,实现可多人远程进入到该web应用程序访问。 在操作上我们将使用

    2024年02月05日
    浏览(59)
  • 【Python】Web学习笔记_flask(4)——钩子函数

    钩子函数可以用来注册在请求处理的不同阶段执行出 Flask的请求钩子指的是在执行视图函数前后执行的一些函数, 之前是有4种,但是  before_first_request已经被删除了,使用时会报错 before_request:在每次请求前执行,比如校验权限,也可以用来记录用户最后的在线时间 after_r

    2024年02月14日
    浏览(44)
  • 【Python】Web学习笔记_flask(3)——上传文件

    用GET、POST请求上传图片并呈现出来 首先还是创建文件上传的模板 然后需要定义几个函数: upload():路由函数,接收GET请求时,显示模板文件内容,接收post请求时,上传图片 allowed_file():检测上传的文件是否满足设置的类型 random_file():为上传的文件重新创建随机的不重复文

    2024年02月14日
    浏览(44)
  • 学习flask技术并应用在跨模态视频检索系统

    使用Flask技术在前端部署代码,通过http通信完成对双后端python端的AI服务调用,再返回给前端Top10视频片段的时间戳和置信度分数,以MVC模式绑定在前端的控件中进行可视化展示,显示Top10视频片段时间戳序列和封面图,点击即可跳转播放。 Flask是一个基于Python的轻量级Web应用

    2024年02月15日
    浏览(38)
  • 【Python】Web学习笔记_flask(1)——get&post

    flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 POST请求 使用request.form可以接受表单数据 login.html模板: 获取用户名称、密码

    2024年02月14日
    浏览(39)
  • 【Python】Web学习笔记_flask(2)——get&post

    flask提供的request请求对象可以实现获取url或表单中的字段值 GET请求 从URL中获取name、age两个参数 POST请求 使用request.form可以接受表单数据 login.html模板: 获取用户名称、密码

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包