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 import引入不同路径下的模块
Jul 11 Python
Python实现解析Bit Torrent种子文件内容的方法
Aug 29 Python
Python补齐字符串长度的实例
Nov 15 Python
Python语言进阶知识点总结
May 28 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
pip install python 快速安装模块的教程图解
Oct 08 Python
python matplotlib拟合直线的实现
Nov 19 Python
Pytorch中Tensor与各种图像格式的相互转化详解
Dec 26 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
Python之Sklearn使用入门教程
Feb 19 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+js iframe实现上传头像界面无跳转
2014/04/29 PHP
smarty中post用法实例
2014/11/28 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
一个原生的用户等级的进度条
2010/07/03 Javascript
myEvent.js javascript跨浏览器事件框架
2011/10/24 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
Python的词法分析与语法分析
2013/05/18 Python
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
python批量制作雷达图的实现方法
2016/07/26 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python中print函数简单使用总结
2019/08/05 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
python实现扫雷游戏
2020/03/03 Python
keras处理欠拟合和过拟合的实例讲解
2020/05/25 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
保时捷设计:Porsche Design
2019/03/30 全球购物
计算机专业毕业生的自我评价
2013/11/18 职场文书
材料员岗位职责
2014/03/13 职场文书
公司开业庆典主持词
2014/03/21 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL