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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
用Python进行基础的函数式编程的教程
Mar 31 Python
Python读取properties配置文件操作示例
Mar 29 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
python异步实现定时任务和周期任务的方法
Jun 29 Python
python创建子类的方法分析
Nov 28 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
python的flask框架难学吗
Jul 31 Python
python Xpath语法的使用
Nov 26 Python
python 获取谷歌浏览器保存的密码
Jan 06 Python
Python 使用dict实现switch的操作
Apr 07 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
用PHP和ACCESS写聊天室(十)
2006/10/09 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php浏览历史记录的方法
2015/03/10 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
Json解析的方法小结
2016/06/22 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
js数组去重的方法总结
2019/01/18 Javascript
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
创立科技Java面试题
2015/11/29 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
茶叶生产计划书
2014/01/10 职场文书
就业协议书范本
2014/04/11 职场文书
教师专业自荐信
2014/05/31 职场文书
代办委托书怎么写
2014/08/01 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
党员承诺书范文2015
2015/04/27 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书