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类的定义、继承及类对象使用方法简明教程
May 08 Python
python使用PyGame模块播放声音的方法
May 20 Python
浅谈python正则的常用方法 覆盖范围70%以上
Mar 14 Python
在python中pandas的series合并方法
Nov 12 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
使用Python实现画一个中国地图
Nov 23 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
Python集合set()使用的方法详解
Mar 18 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
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
WAF的正确bypass
2017/01/05 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
Prototype Array对象 学习
2009/07/19 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
详解javascript事件绑定使用方法
2016/10/20 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
python区块及区块链的开发详解
2019/07/03 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
Python 随机按键模拟2小时
2020/12/30 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
英国家庭、花园、汽车和移动解决方案:Easylife Group
2018/05/23 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
优秀女职工事迹材料
2014/02/06 职场文书
红色经典观后感
2015/06/18 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
Android Rxjava3 使用场景详解
2022/04/07 Java/Android
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
Go语言编译原理之源码调试
2022/08/05 Golang