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原始套接字编程示例分享
Feb 21 Python
Python heapq使用详解及实例代码
Jan 25 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
详解Python3的TFTP文件传输
Jun 26 Python
Python 监测文件是否更新的方法
Jun 10 Python
numpy数组广播的机制
Jul 12 Python
简单了解python反射机制的一些知识
Jul 13 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
基于python实现查询ip地址来源
Jun 02 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
Jan 29 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
Python基础详解之邮件处理
Apr 28 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 静态变量与自定义常量的使用方法
2010/01/26 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
PHP图片加水印实现方法
2016/05/06 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
javascript轮播图算法
2016/10/21 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
Angularjs Promise实例详解
2018/03/15 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python常见数字运算操作实例小结
2019/03/22 Python
利用Python实现kNN算法的代码
2019/08/16 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
历史学专业推荐信
2013/11/06 职场文书
kfc实习自我鉴定
2013/12/14 职场文书
机关会计岗位职责
2014/04/08 职场文书
大学生演讲稿
2014/04/25 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
关于童年的读书笔记
2015/06/26 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
redis lua限流算法实现示例
2022/07/15 Redis