python异步Web框架sanic的实现
作者:虫师 发布时间:2021-01-17 01:37:57
我们继续学习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/
请求堵塞
针对上面的例子,假设test()
视图函数的处理需要5秒钟,那么请求就堵塞了。
from time import sleep
app = 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, 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异步的使用参考上一篇文章,重新启动服务。这次前端就不在堵塞了。
如果看 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了。
来源:https://www.cnblogs.com/fnng/p/12783542.html


猜你喜欢
- 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(
- 1 概述C/C++和Java(以及大多数的主流编程语言)都有自己成熟的单元测试框架,前者如Check,后者如JUnit,但这些编程框架本质上
- 前言一直都觉得vue的插件生涩难懂,但是又很好奇,在看了几篇文章,试着写了写之后觉得也没那么难,本文主要实现一个简单的Toast插件,方便迁
- 一.pyinstaller简介pyinstaller将Python脚本打包成可执行程序,使在没有Python环境的机器上运行最新版是pyin
- 1、实现的效果示例代码:df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2
- python中字典的key不能是可变类型。字典可存储任意类型对象,其中值可以取任何数据类型,但键必须是不可变的,如字符串、数字或元组。语法格
- 阅读上一篇:AJAX的jQuery实现入门(一)要写入数据库,我们知道的最简单的就是注册了, 就做个最简单的注册表单, 看看是如何提交数据的
- 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们
- sql server 2008 r2 express是什么版本express是精简版的意思 r2是2008的第2版本,推荐使用。SQL Se
- 前言使用pandas对数据操作,筛选数据时,根据任务要求有时不仅要某列中存在空值的行,并且要删除某列中指定值所在行。1.data.dropn
- 这篇文章主要介绍了微信小程序 云开发模糊查询实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用
- 最近看到大家都练习写树,偶也学习学习写了一个,大家多多批评,我好进步。不过我看了一些树的xml文档都是在xml中就已经有了树的结构,所以我写
- 浏览器的具体功能都储存在服务器端的Browscap.ini中:<% SET
- 本文实例讲述了Python实现Windows上气泡提醒效果的方法。分享给大家供大家参考。具体实现方法如下:# -*- encoding: g
- 引 言前提:以下讨论的前提 是设置MySQL的crash safe相关参数为双1:sync_binlog=1innodb_flush_log
- Python字符串字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 :s="a1a2···an"
- 为什么需要线程池呢? 设想一下,如果我们使用有任务就开启
- 怀旧滤镜实现原理不管是荣耀华为手机还是其他的手机,我们都可以找到相机中的怀旧效果,这是手机中常用的一种滤镜效果。怀旧风格的设计主要是在图像的
- 以前我浏览博客的时候记得别人说过,BCELoss与CrossEntropyLoss都是用于分类问题。可以知道,BCELoss是Binary