python 异步Web框架sanic

我们继续学习Python异步编程,这里将介绍异步Web框架sanic,为什么不是tornado?从框架的易用性来说,Flask要远远比tornado简单,可惜flask不支持异步,而sanic就是类似Flask语法的异步框架。

github:GitHub - sanic-org/sanic: Accelerate your web app development | Build fast. Run fast.

不过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 NotFoundapp = 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/

请求堵塞

针对上面的例子,假设test() 视图函数的处理需要5秒钟,那么请求就堵塞了。

……from time import sleepapp = Sanic(name="pyapp")@app.route('/')
async def test(request):sleep(5)return json({'hello': 'world'})……

 重启服务,通过浏览器发送请求,我们发现请求耗时5秒,这显然对用户就不能忍受的。

异步非堵塞

所以,我们要实现异步调用,修改后的完整代码如下:

import asyncio
from sanic import Sanic
from sanic.response import json
from sanic.exceptions import NotFound
from time import sleep, ctimeapp = 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.loopmyLoop.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异步的使用参考上一篇文章,重新启动服务。这次前端就不在堵塞了。

如果看 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()视图函数的响应。

他仍然在执行,但不会堵塞test()视图函数的响应。

思考:假如我的需求是:请求之后先告诉我已经处理了,然后默默的去处理,什么时候处理来再主动把处理的结果告诉。那么这就需要用到 websocket了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和全局变量]

分类目录:《系统学习Python》总目录 闭包函数(带有外围def作用域引用和嵌套的def)常常可以实现相同的效果,特别是用于像被装饰的最初咱数这样的静态数据时。然而在下面这个例子中,我们也需要外层作用域中的一个计数器&…

{MySQL} 数据库约束 表的关系 新增删除 修改 查询

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据库约束1.1约束类型:1.2 NULL约束1.3unique 唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN K…

Kaggle:数据科学竞赛的殿堂与个人成长的舞台

一、产品简介: 它是一个举办数据科学竞赛、托管数据库、编写和分享代码的在线平台。这个数据集就像一个超级大的信息库,包含了我们日常生活中的各种事情,比如电子游戏的销量啊,还有空气质量如何受到污染等等。这些信息都是现实中…

车载毫米波雷达及芯片新趋势研究1--毫米波雷达与其它车载传感器互补,研发及量产门槛较高

1.1 毫米波雷达是利用毫米波电磁波波束工作的雷达,车载是首要应用场景  毫米波雷达是一种以波长位于1-10mm、频率在30-300GHz的电磁波作为放射波的雷达传感器。  毫米波雷达利用毫米波波束进行工作。①检测障碍物时: 直接通过有无回波确认&#xff…

06-C++ 类和对象-多态

类与对象 多态 1. 简介 一个事物的多种形态,简称多态。 物的多态 同一个人在不同人面前,角色不同 如: 在父母面前在对象面前在朋友面前在同事面前 事的多态 同一种事情,在不同情况下展现不同 如: 吃饭 中国人 筷子 …

8天狂收6100颗星,可商用!东京工业、麻省理工等开源Stream Diffusion

加州大学伯克利分校、东洋大学、东京工业大学、麻省理工学院和筑波大学等研究人员,联合开源了一款创新性实时交互图像生成框架——Stream Diffusion。 Stream Diffusion的技术创新点在于,将传统的顺序去噪变成流批处理去噪,消除了漫长的等待…

vue项目hdr格式文件放在assets下rgbeloader.load获取不到问题解决

如下图 我再App.vue组件中这样写 艾特符号定位 告诉系统 要src下的assets下的xhdr下的xidis.hdr 但是运行项目 他会告诉你找不到这个资源 我们改一下 我们组件时 App.vue 与assets同在 src目录下 用 ./去找 这样也是找不到的 我们需要将它放在静态资源包public下 public路…

CDSP考取的价值:成为数据安全认证专家的好处

哈喽IT的朋友们👋,今天想和大家聊聊一个超级有用的专业认证:CDSP,也就是数据安全认证专家。如果你在数据安全领域或者对这方面感兴趣,这个认证绝对值得你去考取哦! 1.🎓提升专业性:获…

MCEWMDRMNDBootstrap.dll文件丢失,软件游戏无法启动,怎样下载修复

不少小伙伴反馈,在打开某些游戏或软件的时候,Windows会提示“MCEWMDRMNDBootstrap.dll文件丢失,软件无法启动”,不知道应该怎样办? 首先,我们先来了解“MCEWMDRMNDBootstrap.dll文件”是什么? …

单片机开发从小工到专家

有道无术,术尚可求;有术无道,止于术 背景 向单片机嵌入式开发小伙伴推荐了几本书,阅读量破10 1. 适用范围 2. 书籍推荐 书籍推荐 3. 大师介绍 大师介绍 4. 大师书籍编写逻辑 25年大师出版的关于:嵌入式单片…

wireshark access/trunk/hybrid报文分析

1,access接口 发送带vlan的报文 wireshark交换机配置 [Huawei-GigabitEthernet0/0/1] [Huawei-GigabitEthernet0/0/1]port link-type access [Huawei-GigabitEthernet0/0/1]port default vlan 100 [Huawei-GigabitEthernet0/0/2]port link-type access [Huawei-Gig…

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目(jar) 1.3、编写 Dockerfile 文件,构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a)简…

SonarQube安装踩坑记录

如果用java1.8和mysql,则SonarQube版本不能超过7.8,看这里。 SonarQube7.8安装包地址: https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip 安装步骤: 1、下载SonarQube安装包 wget https://binari…

几代WiFi有什么差异,它们有什么区别

最典型的差异指标:单流传输速率 第一代 基于的标准: 802.11 使用频率:2.4GHz 单流最大传输速率:2Mbit/s 第二代 基于的标准: 802.11b 使用频率:2.4GHz 单流最大传输速率:11Mbit/s 第三代 …

Anolis安装Jdk保姆级教学

前言 欢迎来到本博客,我们将带领你完成在Anolis操作系统上安装Java Development Kit(JDK)的详细过程。Anolis操作系统是一款基于Linux的轻量级操作系统,专为容器和云原生应用而设计。在Anolis上安装JDK将为你提供一个稳定、高效的…

洛谷:集合与前缀和

1.亲戚(并查集) #include<iostream> using namespace std; int n,m,p; int m1,m2,p1,p2; int f[5005];int find(int x)//查询根节点&#xff0c;根节点的标志是根节点的父节点是自己 {if(f[x]!x)f[x]find(f[x]);//路径压缩&#xff0c;父节点变为根节点,方便下次询问retu…

Python 简易图形界面库easygui 对话框大全(续)

目录 EasyGUI库 主要特点 使用场景 对话框样式 10. 文件打开框 fileopenbox 11. 文件保存框 filesavebox 12. 目录打开框 diropenbox 13. 索引对话框 indexbox 14. 例外报告框 exceptionbox 15. 代码文本框 codebox 16. 密码输入框 passwordbox 17. 多重文本框 mul…

MySql数据库(3)——DML

一、DML DML&#xff08;Data Manipulation Language&#xff09;数据操作语言&#xff0c;常用语句&#xff1a; insert&#xff1a;输入delete&#xff1a;删除update&#xff1a;修改 插入数据 方式一&#xff1a;insert into 表名 &#xff08;列1&#xff0c;列2……&a…

jmeter之beanshell使用:常用变量汇总

1.变量--日期 使用场景&#xff1a;当入参日期是变量&#xff0c;取当前日期 使用如下&#xff1a; &#xff08;1&#xff09;当前日期 import java.text.SimpleDateFormat; import java.util.Date;// 创建 SimpleDateFormat 对象并指定日期格式 SimpleDateFormat dateFor…

价格成谜,小米汽车到底要卖给谁?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 “不要再讲9.9万了&#xff0c;不可能的&#xff0c;也不要再讲14.9万&#xff0c;小米SU7是有理由的贵”&#xff0c;小米集团创始人、董事长雷军在12月28日的小米汽车技术发布会上&#xff0c;把价格作为最大的悬念留给了市场。…