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模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
基于hashlib模块--加密(详解)
Jun 21 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python判断自身是否正在运行的方法
Aug 08 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python单元测试框架pytest的使用示例
Oct 07 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
pytorch 6 batch_train 批训练操作
May 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 实例化类的一点摘记
2008/03/23 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
Linux环境下php实现给网站截图的方法
2016/05/03 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
2016/08/04 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
详解handlebars+require基本使用方法
2016/12/21 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
用Python进行TCP网络编程的教程
2015/04/29 Python
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
实例介绍Python中整型
2019/02/11 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
公司管理建议书范文
2014/03/12 职场文书
自强之星事迹材料
2014/05/12 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
交通事故责任认定书
2015/08/06 职场文书