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 10 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python3.6+selenium实现操作Frame中的页面元素
Jul 16 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
python函数不定长参数使用方法解析
Dec 14 Python
PyTorch实现更新部分网络,其他不更新
Dec 31 Python
python如何求100以内的素数
May 27 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
python如何快速生成时间戳
Jul 21 Python
Pycharm中如何关掉python console
Oct 27 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
图形数字验证代码
2006/10/09 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
JavaScript 学习初步 入门教程
2010/03/25 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
js脚本实现数据去重
2014/11/27 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
中科软笔试题和面试题
2014/10/07 面试题
党员批评与自我批评
2014/02/12 职场文书
工程项目建议书范文
2014/03/12 职场文书
开业典礼主持词
2014/03/21 职场文书
总结表彰大会主持词
2014/03/26 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
国际最新研究在陨石中发现DNA主要成分 或由陨石带来地球
2022/04/29 数码科技