python sanic视频_python 异步Web框架sanic

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

不过sanic对环境有要求:macOS/linux

python 3.6+

安装 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()视图函数的响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值