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 调用DLL操作抄表机
Jan 12 Python
python getopt 参数处理小示例
Jun 09 Python
Python的gevent框架的入门教程
Apr 29 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
解决pycharm界面不能显示中文的问题
May 23 Python
django解决跨域请求的问题
Nov 11 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
python语言基本语句用法总结
Jun 11 Python
Mac安装python3的方法步骤
Aug 09 Python
python打印异常信息的两种实现方式
Dec 24 Python
python获取栅格点和面值的实现
Mar 10 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 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
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
星际争霸中的热键
2020/03/04 星际争霸
一个php作的文本留言本的例子(六)
2006/10/09 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
Git命令之分支详解
2021/03/02 PHP
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
Python内置函数OCT详解
2016/11/09 Python
Python字符串处理实例详解
2017/05/18 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
Python抓取框架Scrapy爬虫入门:页面提取
2017/12/01 Python
Python3中详解fabfile的编写
2018/06/24 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
浅谈CSS3动画的回调处理
2016/07/21 HTML / CSS
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
劳动实践课感言
2014/02/01 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
美术教师个人总结
2015/02/06 职场文书
校运会加油稿大全
2015/07/22 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP