python | gunicorn,一个非常实用的 Python 库!

本文来源公众号“python”,仅用于学术分享,侵权删,干货满满。

原文链接:gunicorn,一个非常实用的 Python 库!

大家好,今天为大家分享一个非常实用的 Python 库 - gunicorn。

Github地址:https://github.com/benoitc/gunicorn

在部署 Python Web 应用程序时,选择合适的 WSGI 服务器是关键的一步。Gunicorn(Green Unicorn)是一个高性能、易于使用的 Python WSGI HTTP 服务器,适用于各种应用部署场景。Gunicorn 设计简洁,支持多种工作模式,能够有效地管理和处理大量并发请求。本文将详细介绍 Gunicorn 库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

1 安装

要使用 Gunicorn 库,首先需要安装它。以下是安装步骤:

1.1 使用 pip 安装

可以通过 pip 直接安装 Gunicorn:

pip install gunicorn

1.2 确认安装

安装完成后,可以通过以下命令确认安装是否成功:

gunicorn --version

2 特性

  1. 高性能:基于预分叉(pre-fork)模型,能够高效处理并发请求。

  2. 简单易用:配置简单,支持多种命令行参数和配置文件。

  3. 灵活:支持多种工作模式(如同步、异步、基于事件循环的工作模式),适应不同的应用需求。

  4. 可扩展:支持自定义中间件、钩子函数等,方便扩展功能。

  5. 广泛支持:兼容多种 Python Web 框架,如 Django、Flask、FastAPI 等。

3 基本功能

3.1 启动一个简单的应用

可以通过以下命令启动一个简单的 Flask 应用:

# app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()

启动应用:

gunicorn app:app

3.2 指定端口和工作进程数量

可以通过命令行参数指定端口和工作进程数量:

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

3.3 使用配置文件

可以将配置参数写入配置文件中,方便管理和复用:

# gunicorn_config.py
workers = 4
bind = '127.0.0.1:8000'
loglevel = 'debug'
accesslog = '-'
errorlog = '-'

使用配置文件启动应用:

gunicorn -c gunicorn_config.py app:app

4 高级功能

4.1 使用多种工作模式

Gunicorn 支持多种工作模式,可以根据应用需求选择合适的模式:

1. 同步模式

适用于大多数应用,默认工作模式:

gunicorn -w 4 -k sync app:app
2. 异步模式

适用于需要处理大量 I/O 操作的应用,如 WebSocket、长连接等:

gunicorn -w 4 -k gevent app:app
3. 基于事件循环的模式

适用于异步框架,如 FastAPI:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app

4.2 自定义中间件

可以编写自定义中间件,扩展 Gunicorn 的功能:

# middleware.py
from gunicorn.middleware import Middlewareclass CustomMiddleware(Middleware):def __init__(self, app):self.app = appdef __call__(self, environ, start_response):# 在此处添加自定义逻辑return self.app(environ, start_response)

在配置文件中使用自定义中间件:

# gunicorn_config.py
def when_ready(server):server.log.info("Server is ready. Spawning workers")def pre_fork(server, worker):server.log.info("Worker is about to be forked")def post_fork(server, worker):server.log.info("Worker spawned")def pre_exec(server):server.log.info("Forked child, re-executing")def post_request(worker, req, environ, resp):worker.log.debug("%s %s" % (req.method, req.path))preload_app = True
worker_class = 'sync'
workers = 4
bind = '127.0.0.1:8000'
loglevel = 'debug'
accesslog = '-'
errorlog = '-'

4.3 钩子函数

Gunicorn 支持多种钩子函数,可以在特定事件发生时执行自定义逻辑:

# gunicorn_config.py
def on_starting(server):print("Starting Gunicorn")def on_exit(server):print("Exiting Gunicorn")def pre_request(worker, req):print(f"Request: {req.method} {req.path}")def post_request(worker, req, environ, resp):print(f"Response: {resp.status}")bind = '127.0.0.1:8000'
workers = 4

5 实际应用场景

5.1 部署 Flask 应用

在生产环境中部署 Flask 应用,使用 Gunicorn 处理并发请求。

# app.py
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run()

启动应用:

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

5.2 部署 Django 应用

在生产环境中部署 Django 应用,使用 Gunicorn 提升并发处理能力。

# 在项目目录下执行
gunicorn myproject.wsgi:application -w 4 -b 127.0.0.1:8000

5.3 部署 FastAPI 应用

在生产环境中部署 FastAPI 应用,使用 Gunicorn 结合 Uvicorn 处理异步请求。

# app.py
from fastapi import FastAPIapp = FastAPI()@app.get('/')
def read_root():return {"Hello": "World"}

启动应用:

gunicorn -w 4 -k uvicorn.workers.UvicornWorker app:app

5.4 自定义中间件实现访问日志

在生产环境中,为应用添加自定义访问日志记录功能。

# middleware.py
from gunicorn.middleware import Middlewareclass AccessLogMiddleware(Middleware):def __init__(self, app):self.app = appdef __call__(self, environ, start_response):request_method = environ.get('REQUEST_METHOD')path_info = environ.get('PATH_INFO')print(f"Access log: {request_method} {path_info}")return self.app(environ, start_response)# gunicorn_config.py
def when_ready(server):server.log.info("Server is ready. Spawning workers")def pre_fork(server, worker):server.log.info("Worker is about to be forked")def post_fork(server, worker):server.log.info("Worker spawned")def pre_exec(server):server.log.info("Forked child, re-executing")def post_request(worker, req, environ, resp):worker.log.debug("%s %s" % (req.method, req.path))preload_app = True
worker_class = 'sync'
workers = 4
bind = '127.0.0.1:8000'
loglevel = 'debug'
accesslog = '-'
errorlog = '-'

6 总结

Gunicorn 库是一个功能强大且易于使用的 WSGI 服务器,能够帮助开发者在各种应用场景中高效地处理并发请求。通过支持多种工作模式、简单易用、灵活可扩展和广泛支持,Gunicorn 提供了强大的功能和灵活的扩展能力。本文详细介绍了 Gunicorn 库的安装方法、主要特性、基本和高级功能,以及实际应用场景。希望本文能帮助大家全面掌握 Gunicorn 库的使用,并在实际项目中发挥其优势。无论是在部署 Flask、Django 还是 FastAPI 应用中,Gunicorn 库都将是一个得力的工具。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

photoshop学习笔记——选区3 快速选择工具

快速选择工具 W shift W 在3种快速选择工具之间切换 对象选择工具 photoshop CC中没有这个工具,利用AI,将款选中的对象快速的提取选区,测试了一下,选区制作的非常nice快速选择工具 跟磁性套索类似,自动识别颜色相似…

ClkLog:开源用户行为分析框架,让数据分析更轻松

ClkLog:开源用户行为分析框架,让数据分析更轻松 在数据驱动的时代,找到一个好用的用户行为分析工具真是难上加难。但是今天你有福了,开源免费的 ClkLog 就是你的不二选择!本文将为你详细介绍 ClkLog 的功能特点、技术架…

Spark RPC框架详解

文章目录 前言Spark RPC模型概述RpcEndpointRpcEndpointRefRpcEnv 基于Netty的RPC实现NettyRpcEndpointRefNettyRpcEnv消息的发送消息的接收RpcEndpointRef的构造方式直接通过RpcEndpoint构造RpcEndpointRef通过消息发送RpcEndpointRef Endpoint的注册Dispatcher消息的投递消息…

聚焦民生服务 助力企业发展 区块链应用加速落地

聚焦民生服务,助力企业发展,区块链应用正在加速落地。这一趋势体现了区块链技术在多个领域的广泛应用和深远影响。以下是对这一主题的详细分析: 一、区块链在民生服务中的应用 政务服务 数据共享与打通:区块链技术利用其分布式账…

Python酷库之旅-第三方库Pandas(048)

目录 一、用法精讲 171、pandas.Series.nlargest方法 171-1、语法 171-2、参数 171-3、功能 171-4、返回值 171-5、说明 171-6、用法 171-6-1、数据准备 171-6-2、代码示例 171-6-3、结果输出 172、pandas.Series.nsmallest方法 172-1、语法 172-2、参数 172-3、…

自动化测试 - selenium 环境搭建

在进行自动化测试时,Selenium 是一个非常强大的工具,在使用前需要做一些环境准备。 1. 配置 Chromedriver 访问 Chrome 浏览器的官方网站(https://www.google.cn/chrome/),下载并安装 Chrome 浏览器。 接下来&#x…

html必知必会-html内嵌JavaScript和文件路径

文章目录 HTML JavaScriptHTML <script> 标签JavaScript 的简单示例HTML <noscript> 标签HTML 文件路径绝对文件路径相对文件路径总结 HTML JavaScript JavaScript 使 HTML 页面更具动态性和交互性。 示例 <!DOCTYPE html> <html> <body><…

自训练和增量训练word2vec模型

1、自己准备训练语料文件 根据自己的业务场景准备训练数据&#xff0c;比如用户在商城上的同购行为序列或同浏览行为序列。 我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。 1.1 准备语料库文件 # 示例&#xff1a;准备自己的一个大规模的语…

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用

MR简介 RDMA通信中MR(Memory Region)指的是由RDMA软件层在内存中规划出的一片区域&#xff0c;用于存放收发的数据。IB协议中&#xff0c;用户在申请完用于存放数据的内存区域之后&#xff0c;都需要通过调用IB框架提供的API注册MR&#xff0c;才能让RDMA网卡访问这片内存区域…

2.1、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、前言 在 MATLAB 中进行绘图是一种非常常见且实用的操作&#xff0c;可以用来可视化数据、结果展示、分析趋势等。通过 MATLAB 的绘图功能&#xff0c;用户可以创建各种类型的图形&#xff0c;包括线图、散点图、柱状图、曲线图等&#xff0c;以及三维图形、动画等复杂的可视…

数据中台 | 3分钟带你读懂数据中台的由来

1.数据中台产生的原因 数据中台的概念起源于中国阿里巴巴集团提出的“大中台&#xff0c;小前台”战略。这一理念的核心在于通过构建强大的中台体系&#xff0c;为前端的快速创新和个性化业务需求提供强有力的支持。具体到数据中台&#xff0c;其设计初衷是为了应对企业内部数…

springboot在加了mapper之后报错

springboot在加了mapper之后报错 最后发现是spring boot版本不兼容&#xff0c;spring-boot-starter-parent换成3.0.5之后可以了

计算机基础-IO

一、裸机中的IO 我们先看下计算机的组成部分&#xff1a; 从图中我们很清楚的看到Input/Output 即为 IO&#xff0c;也就是计算机主机和外部设备进行信息的交换。 这种交换可能是磁盘IO也有可能是网络IO。 二、操作系统中的IO 操作系统分为内核态和用户态&#xff0c;且默认…

活动预告|8月3日 Streaming Lakehouse Meetup · Online 与你相约!

随着大数据分析技术的发展&#xff0c;越来越多的企业采用了数据湖架构。基于 Lakehouse 的架构优势&#xff0c;结合 Flink 的 Streaming 实时流处理能力&#xff0c;Flink 推出了新一代的“Streaming Lakehouse”技术。这一技术旨在能够让数据在湖上自由流动&#xff0c;为用…

js 习题 3

文章目录 绪论12345678910 求最长公共后缀111213 最大公约数1415结语 绪论 『虽有遗憾&#xff0c;绝不后悔。』—— 「古剑奇谭」 1 let buf"";process.stdin.on("readable",function(){let chunkprocess.stdin.read();if(chunk){bufchunk.toString();} …

从零开始创建vue3项目——包含项目初始化、element-plus、eslint、axios、router、pinia、echarts

项目启动 初始化vue3项目 这里建议先下载pnpm&#xff0c;下载速度更快&#xff0c;如果还没下载可以使用 npm install -g pnpm 如果遇到报错问题&#xff0c;如下 可以在命令行输入下面的指令以切换到淘宝镜像源 npm config set registry https://registry.npm.taobao.org…

2024最佳游戏引擎排行

游戏产业几十年来一直是一个大生意&#xff0c;而且发展势头迅猛。据估计&#xff0c;全球游戏市场在 2025 年每年将达到 5031.4 亿美元&#xff0c;2023 年为 3960 亿美元。 尽管如今有市面上有各种各样的解决方案&#xff0c;但游戏开发人员和管理者在选择适合他们需求的游戏…

kettle从入门到精通 第八十课 ETL之kettle kettle中的json对象字段写入postgresql中的json字段

场景&#xff1a;源数据库表为mysql的其中有json字段&#xff0c;通过kettle 查询出来 插入到目标数据库 postgresql中&#xff0c;对应的表中也有json字段。。但是报错&#xff0c;提示kettle查询出来是varchar的的字段&#xff0c;无法插入到目标数据库中。 1、创建测试表。 …

golang设置远程调试

1. 目标机器构建安装dlv https://github.com/go-delve/delve go build之后将编译号的dlv命令路径添加到PATH里 2. 目标机器下载源代码并且运行dlv dlv debug --headless --listen:2345 --api-version2 --accept-multiclient 3.本机添加go remote 4. 设置断点即可