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中使用PDB库调试程序
Apr 05 Python
Python中函数的多种格式和使用实例及小技巧
Apr 13 Python
对python以16进制打印字节数组的方法详解
Jan 24 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
Python3几个常见问题的处理方法
Feb 26 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 Python
python操作yaml说明
Apr 08 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
教你用python控制安卓手机
May 13 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
编译问题
2006/10/09 PHP
用PHP生成html分页列表的代码
2007/03/18 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
PHP云打印类完整示例
2016/10/15 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
Python中单、双下划线的区别总结
2017/12/01 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
python中count函数简单用法
2020/01/05 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Python计算指定日期是今年的第几天(三种方法)
2020/03/26 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
室外天线与收音机天线杆接合方法
2022/04/05 无线电