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 相关文章推荐
Python3实现从文件中读取指定行的方法
May 22 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
python实现三维拟合的方法
Dec 29 Python
Python内存管理实例分析
Jul 10 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
基于MATLAB和Python实现MFCC特征参数提取
Aug 13 Python
树莓派3 搭建 django 服务器的实例
Aug 29 Python
Python中的上下文管理器相关知识详解
Sep 19 Python
Python中常用的高阶函数实例详解
Feb 21 Python
Python Django view 两种return的实现方式
Mar 16 Python
什么是python的列表推导式
May 26 Python
python 多线程共享全局变量的优劣
Sep 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
2020/06/24 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python实现的登录和操作开心网脚本分享
2014/07/09 Python
深入理解python try异常处理机制
2016/06/01 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
2017/05/24 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
python time.strptime格式化实例详解
2021/02/03 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
春秋航空官方网站:Spring Airlines
2017/09/27 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
幼儿园消防演练方案
2014/02/13 职场文书
汽车促销活动方案
2014/03/31 职场文书
宣传口号大全
2014/06/16 职场文书
批评与自我批评范文
2014/10/15 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
2015年国培研修感言
2015/08/01 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技