使用 Starlette 构建异步 Python 服务
介绍
就构建简单的同步 API 而言,Python 及其生态系统中的 WSGI Web 服务器框架(如 Flask)通常足以完成工作。但是,如果您需要扩展应用程序的后端怎么办?例如,如果您有一个可以扩展其计算预测的机器学习模型怎么办?那么,您还需要确保位于模型顶部的 API 层也可以扩展。在这些情况下,同步 WSGI 框架可能不够用……Starlette 来救援!
Starlette 是一个可以完全异步运行的 ASGI Web 服务器框架。因此,Starlette 可以大规模处理请求,解决上面提出的问题!在接下来的部分中,您将学习以下内容:
- 如何启动并运行 Starlette
- 如何添加路由并提供静态文件
- 如何异步扩展你的服务
让我们开始吧!
安装
Starlette 需要 Python 3.6 或更高版本,可使用pip下载。
要使用pip安装 Starlette ,您可以运行以下命令:
pip install starlette
如果您在虚拟环境中并希望通过requirements.txt文件进行安装,您可以这样做:
# requirements.txt
starlette==0.13.6
pip install -r requirements.txt
下载库后,您就可以开始使用该框架。如您所见,Starlette 有许多导入可供使用。以下是一些非常重要的内容:
# app.py
from starlette.applications import Starlette
from starlette.routing import Route
创建 Starlette 服务
创建 Starlette 服务或 API 非常简单。以下代码演示了如何实例化 Starlette 应用,然后为其创建路由。
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.responses import PlainTextResponse
from starlette.responses import JSONResponse
import uvicorn
from my_model import predict
def index(request):
return PlainTextResponse("My Index Page!")
def model_stats(request):
return JSONResponse({'stats': [1, 0 , 2, 3]})
def model_predict(request):
prediction_req = request.json()
prediction = predict(prediction_req)
return JSONResponse(prediction)
routes = [
Route('/', index),
Route('/stats', model_stats),
Route('/predict', model_predict, methods=['POST'])
]
app = Starlette(debug=True, routes=routes)
if __name__ == "__main__":
uvicorn.run(app, host='0.0.0.0', port=8000)
要创建服务静态文件的路由,只需像这样使用Mount :
from starlette.routing import Mount
from starlette.staticfiles import StaticFiles
routes = [
Route('/', index),
Route('/stats', model_stats),
Route('/predict', model_predict, methods=['POST'])
Mount('/media', app=StaticFiles(directory='media'), name='media')
]
使你的服务异步
这很酷,但是您可以通过使其异步运行来扩展您的预测路由吗?Python 3.5 通过 Python 标准库的新asyncio部分将 async/await 语法引入该语言。使用此语法,您可以创建完全非阻塞的 API 路由。
注意:请小心 - 异步代码非常难以调试。要打开 asyncio 的调试模式,请确保已设置PYTHONASYNCIODEBUG环境变量。
例如:PYTHONASYNCIODEBUG=1 python app.py
以下是新的异步代码:
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.responses import PlainTextResponse
from starlette.responses import JSONResponse
import uvicorn
import asyncio
from my_model import predict
async def index(request):
return PlainTextResponse("My Index Page!")
async def model_stats(request):
return JSONResponse({'stats': [1, 0 , 2, 3]})
async def model_predict(request):
prediction_req = request.json()
prediction = await predict(prediction_req)
return JSONResponse(prediction)
routes = [
Route('/', index),
Route('/stats', model_stats),
Route('/predict', model_predict, methods=['POST'])
]
app = Starlette(debug=True, routes=routes)
if __name__ == "__main__":
uvicorn.run(app, host='0.0.0.0', port=8000)
在上面的示例中,首先导入了asyncio库,以便您可以使用 async/await。接下来,所有路由都被指定为异步路由。请注意model_predict路由,它用于包装机器学习模型的预测功能。现在使用await关键字来充分利用后台模型的异步功能。现在 API 将与模型一起扩展!
结论
在本指南中,您学习了如何使用 Starlette 创建基于 ASGI 框架的 Python HTTP 服务。更重要的是,您发现了如何使您的服务完全异步,以便它可以随着传入的请求数量而扩展。
本指南仅简要介绍了 Starlette 和 ASGI 的世界。除了这里讨论的内容之外,该框架还有许多其他功能。有关更多信息和高级用法,请查看 Starlette文档。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~