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多线程ctrl+c退出问题解决方案
Oct 23 Python
django之常用命令详解
Jun 30 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
python如何爬取个性签名
Jun 19 Python
flask入门之表单的实现
Jul 18 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
python实现KNN分类算法
Oct 16 Python
Python使用type动态创建类操作示例
Feb 29 Python
python变量的作用域是什么
May 26 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字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
微信小程序 地图map实例详解
2017/06/07 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
从0到1构建vueSSR项目之node以及vue-cli3的配置
2019/03/07 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
python中的计时器timeit的使用方法
2017/10/20 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python从零开始创建区块链
2018/03/06 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
作弊检讨书1000字
2014/02/01 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
2014年财政所工作总结
2014/11/22 职场文书
工作能力自我评价2015
2015/03/05 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
适合青年人白手起家的创业项目分享
2019/08/16 职场文书
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server