python 异步Web框架sanic
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 异步Web框架sanic相关的知识,希望对你有一定的参考价值。
我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似Flask语法的异步框架。
github:https://github.com/huge-success/sanic
不过sanic对环境有要求:
- macOS/linux
- python 3.6+
不过,我在macOS上安装 sanic 还是踩了坑。依赖库
ujson
一直安装失败。最后不得不卸载官方python,安装 miniconda(第三方Python安装包,集成了一些额外的工具)。
安装 sanic
> pip3 install sanic
sanic 开发第一个例子
编写官方的第一个例子hello.py
:
from sanic import Sanic
from sanic.response import json
from sanic.exceptions import NotFound
app = Sanic(name="pyapp")
@app.route(\'/\')
async def test(request):
return json({\'hello\': \'world\'})
if __name__ == \'__main__\':
app.error_handler.add(
NotFound,
lambda r, e: sanic.response.empty(status=404)
)
app.run(host=\'0.0.0.0\', port=8000)
运行上面的程序:
> python3 hello.py
[2020-04-21 23:12:02 +0800] [18487] [INFO] Goin Fast @ http://0.0.0.0:8000
[2020-04-21 23:12:02 +0800] [18487] [INFO] Starting worker [18487]
通过浏览器访问:http://localhost:8000/
请求堵塞
针对上面的例子,假设test()
视图函数的处理需要5秒钟,那么请求就堵塞了。
……
from time import sleep
app = Sanic(name="pyapp")
@app.route(\'/\')
async def test(request):
sleep(5)
return json({\'hello\': \'world\'})
……
重启服务,通过浏览器发送请求,我们发现请求耗时5秒,这显然对用户就不能忍受的。
异步非堵塞
所以,我们要实现异步调用,修改后的完整代码如下:
import asyncio
from sanic import Sanic
from sanic.response import json
from sanic.exceptions import NotFound
from time import sleep, ctime
app = Sanic(name="pyapp")
async def task_sleep():
print(\'sleep before\', ctime())
await asyncio.sleep(5)
print(\'sleep after\', ctime())
@app.route(\'/\')
async def test(request):
myLoop = request.app.loop
myLoop.create_task(task_sleep())
return json({\'hello\': \'world\'})
if __name__ == \'__main__\':
app.error_handler.add(
NotFound,
lambda r, e: sanic.response.empty(status=404)
)
app.run(host=\'0.0.0.0\', port=8000)
关于python异步的使用参考上一篇文章,重新启动服务。这次前端就不在堵塞了。
如果看 sanic 的运行日志:
[2020-04-21 23:43:14 +0800] - (sanic.access)[INFO][127.0.0.1:57521]: GET http://localhost:8000/ 200 17
sleep before Tue Apr 21 23:43:14 2020
sleep after Tue Apr 21 23:43:19 2020
他仍然在执行,但不会堵塞test()
视图函数的响应。
思考:假如我的需求是:请求之后先告诉我已经处理了,然后默默的去处理,什么时候处理来再主动把处理的结果告诉。那么这就需要用到 websocket了。
以上是关于python 异步Web框架sanic的主要内容,如果未能解决你的问题,请参考以下文章