python 异步Web框架sanic

我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似Flask语法的异步框架。

github:GitHub - sanic-org/sanic: Accelerate your web app development | Build fast. Run fast.

不过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)INFO127.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()视图函数的响应。

他仍然在执行,但不会堵塞test()视图函数的响应。

思考:假如我的需求是:请求之后先告诉我已经处理了,然后默默的去处理,什么时候处理来再主动把处理的结果告诉。那么这就需要用到 websocket了。

相关推荐
普通网友几秒前
【python】pyspark.errors.exceptions.base.PySparkRuntimeError [JAVA_GATEWAY_EXITED] Java gateway proce
java·python·gateway
zavoryn1 分钟前
Python 面试高频:装饰器、迭代器、生成器和上下文管理器一次讲清
开发语言·python·面试
basketball6163 分钟前
C++ 高级编程:1. 多线程基本操作
开发语言·c++
YJlio4 分钟前
OpenClaw v2026.5.26-beta.1 / beta.2 预发布解读:Gateway 加速、transcript 路径统一、多通道修复、语音增强与安装更新链路加固
人工智能·windows·python·ui·缓存·gateway·outlook
rqtz1 小时前
【机器人】ROS结合Qt开发上位机软件工作空间配置
开发语言·qt·ros
用户新3 小时前
JS事件深度解析四 事件的循环和异步
前端·javascript·事件·event loop
许彰午8 小时前
14_Java泛型完全指南
java·windows·python
广州灵眸科技有限公司9 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) Easy-Eai编译环境准备与更新
服务器·前端·人工智能·python·深度学习
TechWayfarer9 小时前
IP风险等级评估接入实战:金融信贷如何用IP画像辅助风控审核
python·tcp/ip·安全·金融
Esaka_Forever9 小时前
uv init 完整用法(Python 最快包管理器)
服务器·python·uv