当前位置: 首页 > news >正文

Python生态ASGI、WSGI、ASGI库:Starlette、Twisted、granian、Bjoern、Daphne、Waitress、Hypercorn、Cheroot、Meinheld

继Python Web服务器网关接口:WSGI、ASGI、RSGI、uWSGI、uwsgi、Gunicorn、Uvicorn之后,本文汇总几个Python生态下的WSGI服务器项目。

Starlette

官网,FastAPI底层核心引擎,开源(GitHub,12.2K Star,1.2K Fork)轻量级高性能的ASGI框架,提用于构建高性能Web应用。

实战

安装:pip install starlette

fromstarlette.applicationsimportStarlettefromstarlette.responsesimportJSONResponsefromstarlette.routingimportRoute# 定义一个异步的请求处理函数asyncdefhomepage(request):returnJSONResponse({'message':'Hello from Starlette!'})# 创建应用实例并注册路由app=Starlette(routes=[Route('/',homepage)])print("Starlette应用创建成功,可通过uvicorn运行")

路由系统,支持路径参数和多种HTTP方法:

fromstarlette.responsesimportJSONResponse# 定义一个新的异步处理函数,获取用户信息asyncdefget_user(request):# 从路径参数中获取用户名username=request.path_params['username']# 从查询字符串中获取可选参数,如 ?age=25age=request.query_params.get('age','unknown')returnJSONResponse({'username':username,'age':age,'requested_at':str(request.scope['time'])})# 更新应用路由,注意路径中的 {username} 是参数占位符app.routes.append(Route('/user/{username}',get_user))print("动态用户路由已添加。")

通过中间件机制方便地扩展功能,如日志记录、跨域处理、后台任务

fromstarlette.middlewareimportMiddlewarefromstarlette.middleware.corsimportCORSMiddlewarefromstarlette.backgroundimportBackgroundTaskimporttimeasyncdefwrite_log(message:str):awaitasyncio.sleep(0.1)print(f'[后台任务] 日志:{message}')asyncdefsubmit_order(request):task=BackgroundTask(write_log,'用户提交新订单')returnJSONResponse({'status':'submitted'},background=task)# 添加一个支持CORS的中间件middleware=[Middleware(CORSMiddleware,allow_origins=['*'])]

支持HTTP、WebSocket

fromstarlette.websocketsimportWebSocket,WebSocketDisconnect# 定义一个WebSocket端点处理函数asyncdefwebsocket_endpoint(websocket:WebSocket):# 接受WebSocket连接awaitwebsocket.accept()try:# 进入循环,持续监听客户端消息whileTrue:data=awaitwebsocket.receive_text()# 将收到的消息原样发回(实现一个echo服务器)awaitwebsocket.send_text(f"Echo:{data}")exceptWebSocketDisconnect:print("客户端连接已断开。")# 注意:WebSocket路由需要使用 WebSocketRoutefromstarlette.routingimportWebSocketRoute app.routes.append(WebSocketRoute('/ws',websocket_endpoint))print("WebSocket路由已添加,可用于实时通信。")

与重量级的Django相比,Starlette是纯粹的异步框架,性能极高且极度轻量;

与FastAPI相比,更底层更灵活,是学习和定制化异步Web架构的绝佳选择。

不足:高级功能(如自动数据验证)需要自己实现或集成其他库。

适用场景:需要极致性能、完全控制异步流程,想深入理解ASGI原理时。

Twisted

官网,开源(GitHub,6K Star,1.2K Fork)老牌事件驱动网络引擎,支持ASGI,极其成熟,协议支持广泛。

安装:

fromtwisted.webimportserver,resourcefromtwisted.internetimportreactor,endpointsclassSimple(resource.Resource):isLeaf=Truedefrender_GET(self,request):returnb"Hello World"site=server.Site(Simple())endpoint=endpoints.TCP4ServerEndpoint(reactor,8080)endpoint.listen(site)reactor.run()

granian

Rust编写的开源(GitHub,5.3K Star,149 Fork)Python HTTP服务器,基于Hyper(Rust HTTP库)和Tokio(Rust异步运行时)构建。用单一依赖替代传统Gunicorn + Uvicorn + http-tools组合,支持ASGI、RSGI、WSGI三种应用接口,原生支持HTTP/2和WebSocket。

适用场景

  • 需要高性能HTTP/2服务的Python Web应用
  • 想用单一依赖替代Gunicorn + Uvicorn + http-tools组合
  • 对并发连接数有精确控制需求的生产环境
  • 微服务架构中需要统一通信层的企业场景

不适用

  • 需要纯Python实现的场景(granian核心为Rust)
  • 依赖triogevent的异步框架
  • 需要高级调试工具(如 Django Debug Toolbar)的开发阶段
  • ASGI扩展尚未完全覆盖的高级功能场景

实战

安装:

pipinstallgranian pipinstallgranian[pname]# 支持进程命名pipinstallgranian[reload]# 开发环境自动重载pipinstallgranian[uvloop]# Linux/macOS加速

同时支持ASGI、RSGI和WSGI三种协议,无需更换应用层代码,只需切换启动参数即可切换协议

# app.pyasyncdefapp(scope,receive,send):assertscope['type']=='http'awaitsend({'type':'http.response.start','status':200,'headers':[[b'content-type',b'text/plain']],})awaitsend({'type':'http.response.body','body':b'Hello from granian!',})

启动:granian --interface asgi app:app --host 0.0.0.0 --port 8000 --workers 4

核心 HTTP 处理全部在 Rust 层完成,利用 Tokio 异步运行时处理高并发 I/O。granian 的并发控制通过 backpressure 机制实现,在 accept loop 层面限制每个 worker 的最大并发连接数,防止后端过载:granian --backpressure 512 myapp:app

backpressure 值需要根据应用特性调优:I/O 密集型应用(如调用外部 API、数据库查询)可以设置较高值;而 CPU 密集型应用由于 GIL 限制,高并发反而可能降低吞吐量,应设置较低值以获得更好的实际吞吐。

原生支持HTTP/2:granian --http 2 myasgiapp:app

对于需要长连接和双向通信的场景,WebSocket 支持也已内置,默认开启。HTTP/2 的多路复用特性特别适合微服务架构中的内部通信场景,相比 HTTP/1.1 的序列化管理可以显著降低连接开销。

用FastAPI构建简单REST接口,并通过granian高性能部署:

# main.pyfromfastapiimportFastAPI app=FastAPI()@app.get("/hello/{name}")defhello(name:str):return{"message":f"Hello,{name}!"}@app.get("/health")defhealth():return{"status":"ok"}

启动:granian --interface asgi main:app --host 0.0.0.0 --port 8000 --workers 4

支持直接托管静态文件,无需额外中间件:

granian\--static-path-route /static\--static-path-mount ./assets/static\--static-path-expires3600\myapp:app

内置 Prometheus 格式的运行时指标导出,方便接入现有监控体系:granian --interface asgi main:app --http 2 --workers 4 -metrics --metrics-port 9090

主要可用指标包括:

  • granian_workers_spawns:worker启动次数
  • granian_connections_active:当前活跃连接数
  • granian_connections_handled:已处理的连接总数
  • granian_blocking_threads:当前阻塞线程池大小
  • granian_py_wait_cumulative:Python GIL等待累计时间(free-threaded构建恒为0)

Bjoern

开源(GitHub,3K Star,188 Fork)基于libev的C语言实现的高性能Python WSGI服务器。性能极快,常作为性能基准;但仅支持Linux/Unix,不支持Windows。

安装:pip install bjoern

示例

importbjoerndefapp(environ,start_response):start_response('200 OK',[('Content-Type','text/plain')])yieldb'Hello World'bjoern.run(app,'0.0.0.0',8080)

Daphne

Django Channels官方开源(GitHub,2.7K Star,287 Fork)ASGI服务器。

优势:专为Django优化,支持WebSocket

适用场景:Django项目需要实时功能

安装:pip install daphne

Waitress

生产可用的开源(GitHub,1.6K Star,180 Fork)跨平台纯Python WSGI Server,无额外运行时依赖,线程模型直白,部署简单,适合想把Flask、Pyramid、Bottle这类应用稳稳挂起来的人。官方文档。

特点:

  • 纯Python:不依赖C扩展,安装和迁移成本很低,Windows、Unix都能跑。适用于内部系统、传统Web服务、不想折腾部署环境的团队。
  • 线程模型简单:默认多线程WSGI Server,思路:你给它一个 WSGI app,它负责监听、收请求、分发给工作线程。没有太多额外抽象,出问题时也更容易排查。
  • 文档完善:包括反向代理、访问日志、socket activationtrusted proxy等配置细节。

不适用

  • 主要跑ASGI应用(FastAPI、Starlette、Quart等)
  • 对事件循环、WebSocket、异步吞吐有更强诉求
  • 需要更复杂的进程模型或与特定反向代理生态深度耦合的场景

pip install waitress

defapp(environ,start_response):body=b"hello from waitress\n"start_response("200 OK",[("Content-Type","text/plain; charset=utf-8"),("Content-Length",str(len(body))),])return[body]# 把Flask应用直接交给Waitress托管fromflaskimportFlask app=Flask(__name__)@app.get("/")defindex():return{"status":"ok","server":"waitress"}

启动服务:

python-mwaitress--listen=127.0.0.1:8011 simple_app:app

在代码里管理host、port、threads、ident等配置时,可直接使用waitress.serve

fromwaitressimportservefromflask_appimportapp serve(app,host="127.0.0.1",port=8040,threads=6,ident="waitress-demo")

启动脚本:

python server_with_args.py

Hypercorn

开源(GitHub,1.6K Star,141 Fork)基于Uvicorn改进,功能更全面、支持WSGI和ASGI服务器。

特点:支持HTTP/2、HTTP/3、QUIC协议

适用场景:需要现代HTTP协议支持

fromhypercorn.configimportConfigfromhypercorn.asyncioimportserveimportasyncioasyncdefapp(scope,receive,send):awaitsend({'type':'http.response.start','status':200,'headers':[(b'content-type',b'text/plain')]})awaitsend({'type':'http.response.body','body':b'Hello World'})config=Config()config.bind=["0.0.0.0:8080"]asyncio.run(serve(app,config))

Cheroot

官网,CherryPy框架内置的纯Python实现的开源(GitHub,200 Star,97 Fork)WSGI服务器,成熟稳定。

适用场景:需要与CherryPy深度集成的项目

安装:pip install cheroot

示例

fromcherootimportwsgidefapp(environ,start_response):start_response('200 OK',[('Content-Type','text/plain')])return[b'Hello World']server=wsgi.Server(('0.0.0.0',8080),app)server.start()

Meinheld

开源(GitHub,167 Star,57 Fork)基于greenlet的高性能WSGI服务器,PyPi最后一个版本1.0.2,停留于May 17, 2020

优势:支持WebSocket(通过扩展)

性能:比Gunicorn更快,资源占用更低

安装:pip install meinheld

示例:

frommeinheldimportserverdefapp(environ,start_response):start_response('200 OK',[('Content-Type','text/plain')])return[b'Hello World']server.listen(('0.0.0.0',8080))server.run(app)
http://www.jsqmd.com/news/668575/

相关文章:

  • 告别线束噩梦:一文搞懂ADI A2B音频总线如何让车载音频布线减重75%
  • 关于数据库服务器资源降配的效能分析
  • 保姆级教程:用ESP8266和Arduino IDE搞定华为云IOTDA命令下发与响应(附完整代码)
  • 2026年现阶段开平区对口单招平台深度评估与选择指南 - 2026年企业推荐榜
  • 2026年3月常州液碱工厂,这些评价好别错过,工业合成盐酸/酸碱类危险化学品/精制盐酸/食品级盐酸,液碱生产厂家有哪些 - 品牌推荐师
  • 如何显著提升 Google Sheets 数据库批量更新脚本的执行效率
  • Labelme标注实例分割数据时,如何正确区分‘语义’和‘实例’?附COCO格式转换实战
  • 服务经济发展原则:根据我国国民经济发展的需要,确定不同阶段采用国际标准的方向和任务
  • Windows 11 更新后 VirtualBox 虚拟机启动失败 (VERR_NEM_NOT_AVAILABLE) 排查与修复指南
  • MuJoCo肌腱系统核心技术深度解析:生物力学仿真的物理引擎架构设计
  • 不只是AD9361:手把手教你复用ADI官方demo框架,快速验证你的AD/DA新设计
  • 抖音内容获取效率提升10倍?这个开源下载器帮你告别手动搬运
  • 2026年4月辽宁二手电子产品回收市场:如何甄选可靠的服务伙伴? - 2026年企业推荐榜
  • C语言完美演绎8-11
  • 告别过时教程!用C#和InTheHand.Net.Bluetooth NuGet包搞定UWP蓝牙通信(附完整代码)
  • TRNSYS模块太多记不住?这份保姆级模块速查手册(附中英文对照)帮你快速定位
  • CANoe IL层CAPL函数实战:从故障注入到校验和计算,让你的仿真测试更高效
  • 2026年贵阳找销售工作:AI智能体赛道5大企业深度横评 - 精选优质企业推荐官
  • 抖音无水印批量下载终极指南:告别录屏,轻松获取高清内容
  • TuGraph图数据库:5大核心功能全面解析与快速上手指南
  • Fan Control终极教程:免费Windows风扇控制软件完整指南
  • ADS 2023 保姆级教程:从巴特沃斯到椭圆,手把手仿真你的第一个低通滤波器
  • 汉诺塔问题是经典递归问题,其递归关系推导如下
  • 2026年河北高速护栏选购指南:五大可靠品牌深度解析与采购建议 - 2026年企业推荐榜
  • 2026年4月山西吸塑托盘采购指南:五大实力厂家深度解析与推荐 - 2026年企业推荐榜
  • 实测对比:JDY-23、HC-05、HM-10,三款经典蓝牙模块怎么选?附功耗与距离实测数据
  • 3步搞定Windows软件卸载:Bulk Crap Uninstaller完全指南
  • 基于可解释轻量化多项式网络的脑电热感觉分类系统
  • 【LeetCode刷题日记】:字符串替换技巧揭秘
  • SCTransform vs 传统方法:单细胞亚群分析中的标准化选择与性能对比