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.hqwc.cn/news/307554.html

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

相关文章

1200PLC连接分布式IO组态编程应用

SMART PLC作为S7-1200PLC的智能IO从站设备组态和编程应用详细介绍请参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/130257474https://rxxw-control.blog.csdn.net/article/details/130257474这篇博客我们介绍S7-1200PLC和分布式IO连接组…

【LangChain】与文档聊天:将OpenAI与LangChain集成的终极指南

欢迎来到人工智能的迷人世界,在那里,人与机器之间的通信越来越模糊。在这篇博客文章中,我们将探索人工智能驱动交互的一个令人兴奋的新前沿:与您的文本文档聊天!借助OpenAI模型和创新的LangChain框架的强大组合&#x…

决心解开软光栅的心结

最近几天离职在家,是的,还没回老家.白天周中的时候写这个软光栅化渲染器.包括在上班的最后项目大家都不干活的时候我已经开始写了.到今天上午总算是有的看了.细节还差很多,下午把透视校正插值加上,下午加不完就元旦假期之后再说(元旦我要写pbrt的读书笔记).还有摄像机裁剪,背面…

红黑树的删除

导航链接 红黑树的性质     红黑树的旋转、变色     红黑树的插入     红黑树的删除 文章目录 导航链接二叉搜索树如何删除结点?场景一:删除没有孩子的结点场景二:删除有一个孩子的结点场景三:删除有两个孩子的结点 红…

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

1.变量--日期 使用场景:当入参日期是变量,取当前日期 使用如下: (1)当前日期 import java.text.SimpleDateFormat; import java.util.Date;// 创建 SimpleDateFormat 对象并指定日期格式 SimpleDateFormat dateFor…

Linux的账号和权限管理

目录 一、用户账号 1、Linux有三大用户类型: 二、组账号 1、基本组(私有组):有且只有一个,一般为创建用户时指定的组。 2、附加组(公共组):可有可无,用户除了基本组…

WPF中的线程安全:深入理解Dispatcher和UI更新

在 WPF 中, DispatcherObject 只能由 Dispatcher 它与之关联的访问。 例如,后台线程无法更新与 Dispatcher UI 线程上关联的内容Button。 为了使后台线程访问该 Content 属性 Button,后台线程必须将工作委托给 Dispatcher 与 UI 线程关联的工…

什么是计算机视觉

计算机视觉(Computer Vision)是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说,计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标,计算机视觉结合了图像处理、机器学习、模…

paypal实操常见问题——绑卡篇

1、绑美金提款卡的时候卡号类型怎么选? PayPal在绑定美金提现卡的时候,页面里会出来两个选项,一个是“关联借记卡或信用卡”,一个是“关联银行账户” “关联借记卡或信用卡”这个选项是消费的时候用来付款的卡; “关…

SpringCloud(H版alibaba)框架开发教程之Hystrix——附源码(4)

参考博客:https://www.cnblogs.com/cjsblog/p/9391819.html https://blog.csdn.net/tongtong_use/article/details/78611225 Hystrix介绍 在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们…

Mysql使用Mybatis进行时间操作

MySQL中支持以下日期时间类型: DATE:存储年月日(例如:2023-04-05)。范围从"1000-01-01"到"9999-12-31" TIME:存储时分秒(例如:11:22:22)。范围从&q…

【ArkTS入门】ArkTS开发初探:语言特点和开发特点

什么是ArkTS? ArkTS是一个为鸿蒙组件而生的框架,语法亲人好用。基于TypeScript,ArkTS拓展了声明式UI、状态管理等的能力,从本质上来讲,是TypeScript的扩展,主要服务于前端。 ArkTS的开发可以满足“一次开…