LLM大语言模型项目知识点总结——Gunicorn、Flask和Docker

一、Flask框架

1.1 Blueprint

流程:

  • 创建蓝图对象;
  • 在蓝图上定义路由和视图函数;
  • 在应用程序对象上注册蓝图 (url_prefix 参数指定蓝图的URL前缀)

1.2 CORS(app)

Cross-Origin Resource Sharing 处理跨域的需求.

1.3 @app.before_request

  • 钩子函数,在正常执行的时候插入一些东西,先执行这个东西然后再正常执行(hook);
  • 并且先执行 flask app 的 before_request, 再执行 blueprint 的 before_request;
  • 一般用于检验用户权限、请求是否合法等场景。

1.4 flask.Response + yield

  1. 用flask.Response类来实现流式API接口.
  2. 作用:可以实时地将服务器端的数据发送到客户端,而且可以在服务器端生成数据后,立即发送给客户端,而不需要等待所有数据都准备好后再发送。
  3. 这样可以大大节省服务器端的内存和带宽资源,特别是对于需要实时处理大量数据并实时向客户端发送的场景。

1.5 flask.jsonify() VS json.dumps()

flask提供了jsonify函数供用户处理返回的序列化json数据,而python自带的json库中也有dumps方法可以序列化json对象

  1. Content-Type有区别
    jsonify的作用实际上就是将我们传入的json形式数据序列化成为json字符串,作为响应的body,并且设置响应的Content-Type为application/json,构造出响应返回至客户端。
    使用json.dumps时该字段值为text/html.
    总结:Content-Type决定了接收数据的一方如何看待数据,如何处理数据,如果是application/json,则可以直接当做json对象处理,若是text/html,则还要将文本对象转化为json对象再做处理
  2. 接受参数有区别
    jsonify可以接受和python中的dict构造器同样的参数
    json.dumps比jsonify可以多接受list类型和一些其他类型的参数。

1.6 grpc

  • Flask本身并不是一个异步框架,因此在处理高并发请求时会出现性能瓶颈。然而,Flask可以通过与其他异步框架和库的集成来提高并发性能。
  • milvus client(向量数据库)使用了grpc的方式,其自维护了自己的事件循环,与gevent的事件循环冲突。

二、WSGI

2.1 简介

  • web服务器网关接口,只是一个规范,是一个协议,不是服务器,只是服务器和应用程序通信的接口规范。
  • WSGI 协议 规定了Web服务器与Python Web应用程序或框架之间的建议标准接口,以促进跨各种Web服务器的Web应用程序可移植性。
  • WSGI的目标是促进现有服务器和应用程序或web框架的轻松互连。

2.2 WSGI服务器,如Gunicorn

在开发和测试Web应用程序时,尤其是使用Flask或Django等框架时,开发者经常会看到这样的警告信息:

“WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

这个警告信息表明当前的服务器环境仅适用于开发和测试,不应在生产环境中使用。
开发服务器(Development Server)是框架自带的轻量级服务器,方便开发者快速测试和调试应用。
然而,它缺乏生产环境所需的安全性、稳定性和性能优化。
因此,在部署到生产环境时,应该使用适合生产环境的WSGI服务器,如Gunicorn或uWSGI。

2.3 Gunicorn

gunicorn是一个用python编写的wsgi(http服务器) web服务器网关接口规范,是一个轻量级、高效的服务器,专门用于运行python web应用程序。
其主要特点和功能包括:

  1. 高性能,可以轻松地处理高并发请求;
  2. 稳定可靠,可以提供持久的长时间运行,极大地减少了服务器崩溃的可能性;
  3. 容错性,可以做到保持服务的稳定性;
  4. 多种部署方式等等。

2.4 使用Gunicorn来部署Flask应用

就是使用Gunicorn 来代替 app.run()

  1. 安装Gunicorn;
  2. 配置并运行应用
    使用Gunicorn来启动Flask应用:gunicorn -w 4 -b 127.0.0.1:8000 main:app
    -w 4表示使用4个工作进程。
    -b 127.0.0.1:8000表示绑定到本地主机的8000端口。
    myapp:app表示应用实例,其中main是Python文件名,app是Flask实例。
  3. 修改Flask应用代码
    确保Flask应用代码没有在生产环境中调用app.run()。

三、Docker

3.1 简介

就是一个工具,可以把想跑的程序、库文件、配置文件都一起打包。然后在任何一个计算机的节点上,都可以使用这个打好的包。
有了容器,一个命令就能把想跑的程序跑起来,做到了一次打包,到处使用。
Docker 的核心概念包括:

  • 镜像(Image):Docker 镜像是应用程序及其运行环境的只读模板,包含了应用程序代码、运行时、库、环境变量等。
  • 容器(Container):容器是镜像的运行实例,可以启动、停止、移动和删除,容器之间是相互隔离的。
  • Dockerfile:Dockerfile 是定义镜像构建过程的脚本,通过一系列指令(如 FROM、COPY、RUN 等)指定如何构建镜像。

3.2 Dockerfile

Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令和说明,就是用来构建镜像。
通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。

四、基于Gunicorn、Flask和Docker的高并发应用部署

1、环境准备

安装 Python
安装 Flask: pip install flask
安装 Gunicorn: pip install gunicorn
安装 Docker 和 Docker Compose: 从 Docker 官方网站 下载并安装相应的安装包

2、构建Flask项目
3、使用Gunicorn提升Flask性能:

gunicorn -w 4 -b 0.0.0.0:8000 app:app

4、Docker化Flask应用

  • 编写Dockerfile;
  • 构建Docker镜像: docker build -t flask_app . (读取Dockerfile中的指令,构建一个新的Docker镜像);
  • 运行Docker容器: docker run -d -p 8000:8000 flask_app (将主机的8000端口映射到容器的8000端口);
  • 使用Docker Compose管理容器: Docker Compose可以简化多容器应用的管理。
    多阶段构建优化镜像: 为了减小镜像体积,可以在Dockerfile中使用多阶段构建。

你可能感兴趣的:(语言模型,gunicorn,flask)