python异步Web框架sanic的实现


Posted in Python onApril 27, 2020

我们继续学习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/

python异步Web框架sanic的实现

请求堵塞

针对上面的例子,假设test() 视图函数的处理需要5秒钟,那么请求就堵塞了。

from time import sleep

app = Sanic(name="pyapp")

@app.route('/')
async def test(request):
  sleep(5)
  return json({'hello': 'world'})

重启服务,通过浏览器发送请求,我们发现请求耗时5秒,这显然对用户就不能忍受的。

python异步Web框架sanic的实现

异步非堵塞

所以,我们要实现异步调用,修改后的完整代码如下:

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异步的使用参考上一篇文章,重新启动服务。这次前端就不在堵塞了。

python异步Web框架sanic的实现

如果看 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的实现的文章就介绍到这了,更多相关python 异步 sanic内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中将字典转换成其json字符串
Jul 16 Python
在Python下进行UDP网络编程的教程
Apr 29 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
利用python将xml文件解析成html文件的实现方法
Dec 22 Python
Python requests发送post请求的一些疑点
May 20 Python
Python设计模式之原型模式实例详解
Jan 18 Python
pandas实现将dataframe满足某一条件的值选出
Jun 12 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
python库skimage给灰度图像染色的方法示例
Apr 27 #Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 #Python
Django中文件上传和文件访问微项目的方法
Apr 27 #Python
详解Python中namedtuple的使用
Apr 27 #Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 #Python
使用python实现微信小程序自动签到功能
Apr 27 #Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 #Python
You might like
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
PHP常用数组函数介绍
2014/07/28 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
node.js实现端口转发
2016/04/14 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
python测试mysql写入性能完整实例
2018/01/18 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
Python ORM编程基础示例
2020/02/02 Python
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
电子技术专业中专生的自我评价
2013/12/17 职场文书
高中历史教学反思
2014/02/08 职场文书
保险经纪人求职信
2014/03/11 职场文书
经典安踏广告词
2014/03/21 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
市场拓展计划书
2014/05/03 职场文书
爱国演讲稿500字
2014/05/04 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
免职证明样本
2014/10/23 职场文书
环境卫生标语
2015/08/03 职场文书
php引用传递
2021/04/01 PHP
代码复现python目标检测yolo3详解预测
2022/05/06 Python