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标准算法实现数组全排列的方法
Mar 17 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
centos7中安装python3.6.4的教程
Dec 11 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
浅谈python 类方法/静态方法
Sep 18 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 Python
python单例模式的应用场景实例讲解
Feb 24 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
三种php连接access数据库方法
2013/11/11 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
axios基本入门用法教程
2017/03/25 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
jQuery模仿ToDoList实现简单的待办事项列表
2019/12/30 jQuery
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python探索之创建二叉树
2017/10/25 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
使用pip安装python库的多种方式
2019/07/31 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
python编写微信公众号首图思路详解
2019/12/13 Python
python中id函数运行方式
2020/07/03 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
单位介绍信范文
2014/01/18 职场文书
同学会主持词
2014/03/18 职场文书
《充气雨衣》教学反思
2014/04/07 职场文书
学用政策心得体会
2014/09/10 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
七年级上册生物的课件
2019/08/07 职场文书
Vue如何清空对象
2022/03/03 Vue.js
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技