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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
Python实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
详解用python实现简单的遗传算法
Jan 02 Python
使用python和pygame绘制繁花曲线的方法
Feb 24 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
PyQt5每天必学之拖放事件
Aug 27 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
在django中图片上传的格式校验及大小方法
Jul 28 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
python打包多类型文件的操作方法
Sep 21 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 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
php csv操作类代码
2009/12/14 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
动态调用CSS文件的JS代码
2010/07/29 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
IE6下拉框图层问题探讨及解决
2014/01/03 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Python PyQt5整理介绍
2020/04/01 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
优秀少先队员主要事迹材料
2014/05/28 职场文书
2014最新离职证明范本
2014/09/12 职场文书
关于拾金不昧的感谢信
2015/01/21 职场文书
2016党校培训心得体会
2016/01/07 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技