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底层核心引擎开源GitHub12.2K Star1.2K Fork轻量级高性能的ASGI框架提用于构建高性能Web应用。实战安装pip install starlettefromstarlette.applicationsimportStarlettefromstarlette.responsesimportJSONResponsefromstarlette.routingimportRoute# 定义一个异步的请求处理函数asyncdefhomepage(request):returnJSONResponse({message:Hello from Starlette!})# 创建应用实例并注册路由appStarlette(routes[Route(/,homepage)])print(Starlette应用创建成功可通过uvicorn运行)路由系统支持路径参数和多种HTTP方法fromstarlette.responsesimportJSONResponse# 定义一个新的异步处理函数获取用户信息asyncdefget_user(request):# 从路径参数中获取用户名usernamerequest.path_params[username]# 从查询字符串中获取可选参数如 ?age25agerequest.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):taskBackgroundTask(write_log,用户提交新订单)returnJSONResponse({status:submitted},backgroundtask)# 添加一个支持CORS的中间件middleware[Middleware(CORSMiddleware,allow_origins[*])]支持HTTP、WebSocketfromstarlette.websocketsimportWebSocket,WebSocketDisconnect# 定义一个WebSocket端点处理函数asyncdefwebsocket_endpoint(websocket:WebSocket):# 接受WebSocket连接awaitwebsocket.accept()try:# 进入循环持续监听客户端消息whileTrue:dataawaitwebsocket.receive_text()# 将收到的消息原样发回实现一个echo服务器awaitwebsocket.send_text(fEcho:{data})exceptWebSocketDisconnect:print(客户端连接已断开。)# 注意WebSocket路由需要使用 WebSocketRoutefromstarlette.routingimportWebSocketRoute app.routes.append(WebSocketRoute(/ws,websocket_endpoint))print(WebSocket路由已添加可用于实时通信。)与重量级的Django相比Starlette是纯粹的异步框架性能极高且极度轻量与FastAPI相比更底层更灵活是学习和定制化异步Web架构的绝佳选择。不足高级功能如自动数据验证需要自己实现或集成其他库。适用场景需要极致性能、完全控制异步流程想深入理解ASGI原理时。Twisted官网开源GitHub6K Star1.2K Fork老牌事件驱动网络引擎支持ASGI极其成熟协议支持广泛。安装fromtwisted.webimportserver,resourcefromtwisted.internetimportreactor,endpointsclassSimple(resource.Resource):isLeafTruedefrender_GET(self,request):returnbHello Worldsiteserver.Site(Simple())endpointendpoints.TCP4ServerEndpoint(reactor,8080)endpoint.listen(site)reactor.run()granianRust编写的开源GitHub5.3K Star149 ForkPython HTTP服务器基于HyperRust HTTP库和TokioRust异步运行时构建。用单一依赖替代传统Gunicorn Uvicorn http-tools组合支持ASGI、RSGI、WSGI三种应用接口原生支持HTTP/2和WebSocket。适用场景需要高性能HTTP/2服务的Python Web应用想用单一依赖替代Gunicorn Uvicorn http-tools组合对并发连接数有精确控制需求的生产环境微服务架构中需要统一通信层的企业场景不适用需要纯Python实现的场景granian核心为Rust依赖trio或gevent的异步框架需要高级调试工具如 Django Debug Toolbar的开发阶段ASGI扩展尚未完全覆盖的高级功能场景实战安装pipinstallgranian pipinstallgranian[pname]# 支持进程命名pipinstallgranian[reload]# 开发环境自动重载pipinstallgranian[uvloop]# Linux/macOS加速同时支持ASGI、RSGI和WSGI三种协议无需更换应用层代码只需切换启动参数即可切换协议# app.pyasyncdefapp(scope,receive,send):assertscope[type]httpawaitsend({type:http.response.start,status:200,headers:[[bcontent-type,btext/plain]],})awaitsend({type:http.response.body,body:bHello 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:appbackpressure 值需要根据应用特性调优I/O 密集型应用如调用外部 API、数据库查询可以设置较高值而 CPU 密集型应用由于 GIL 限制高并发反而可能降低吞吐量应设置较低值以获得更好的实际吞吐。原生支持HTTP/2granian --http 2 myasgiapp:app对于需要长连接和双向通信的场景WebSocket 支持也已内置默认开启。HTTP/2 的多路复用特性特别适合微服务架构中的内部通信场景相比 HTTP/1.1 的序列化管理可以显著降低连接开销。用FastAPI构建简单REST接口并通过granian高性能部署# main.pyfromfastapiimportFastAPI appFastAPI()app.get(/hello/{name})defhello(name:str):return{message:fHello,{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_spawnsworker启动次数granian_connections_active当前活跃连接数granian_connections_handled已处理的连接总数granian_blocking_threads当前阻塞线程池大小granian_py_wait_cumulativePython GIL等待累计时间free-threaded构建恒为0Bjoern开源GitHub3K Star188 Fork基于libev的C语言实现的高性能Python WSGI服务器。性能极快常作为性能基准但仅支持Linux/Unix不支持Windows。安装pip install bjoern示例importbjoerndefapp(environ,start_response):start_response(200 OK,[(Content-Type,text/plain)])yieldbHello Worldbjoern.run(app,0.0.0.0,8080)DaphneDjango Channels官方开源GitHub2.7K Star287 ForkASGI服务器。优势专为Django优化支持WebSocket适用场景Django项目需要实时功能安装pip install daphneWaitress生产可用的开源GitHub1.6K Star180 Fork跨平台纯Python WSGI Server无额外运行时依赖线程模型直白部署简单适合想把Flask、Pyramid、Bottle这类应用稳稳挂起来的人。官方文档。特点纯Python不依赖C扩展安装和迁移成本很低Windows、Unix都能跑。适用于内部系统、传统Web服务、不想折腾部署环境的团队。线程模型简单默认多线程WSGI Server思路你给它一个 WSGI app它负责监听、收请求、分发给工作线程。没有太多额外抽象出问题时也更容易排查。文档完善包括反向代理、访问日志、socket activation、trusted proxy等配置细节。不适用主要跑ASGI应用FastAPI、Starlette、Quart等对事件循环、WebSocket、异步吞吐有更强诉求需要更复杂的进程模型或与特定反向代理生态深度耦合的场景pip install waitressdefapp(environ,start_response):bodybhello from waitress\nstart_response(200 OK,[(Content-Type,text/plain; charsetutf-8),(Content-Length,str(len(body))),])return[body]# 把Flask应用直接交给Waitress托管fromflaskimportFlask appFlask(__name__)app.get(/)defindex():return{status:ok,server:waitress}启动服务python-mwaitress--listen127.0.0.1:8011 simple_app:app在代码里管理host、port、threads、ident等配置时可直接使用waitress.servefromwaitressimportservefromflask_appimportapp serve(app,host127.0.0.1,port8040,threads6,identwaitress-demo)启动脚本python server_with_args.pyHypercorn开源GitHub1.6K Star141 Fork基于Uvicorn改进功能更全面、支持WSGI和ASGI服务器。特点支持HTTP/2、HTTP/3、QUIC协议适用场景需要现代HTTP协议支持fromhypercorn.configimportConfigfromhypercorn.asyncioimportserveimportasyncioasyncdefapp(scope,receive,send):awaitsend({type:http.response.start,status:200,headers:[(bcontent-type,btext/plain)]})awaitsend({type:http.response.body,body:bHello World})configConfig()config.bind[0.0.0.0:8080]asyncio.run(serve(app,config))Cheroot官网CherryPy框架内置的纯Python实现的开源GitHub200 Star97 ForkWSGI服务器成熟稳定。适用场景需要与CherryPy深度集成的项目安装pip install cheroot示例fromcherootimportwsgidefapp(environ,start_response):start_response(200 OK,[(Content-Type,text/plain)])return[bHello World]serverwsgi.Server((0.0.0.0,8080),app)server.start()Meinheld开源GitHub167 Star57 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[bHello World]server.listen((0.0.0.0,8080))server.run(app)