python異步Web框架sanic的實現(xiàn)
我們繼續(xù)學(xué)習(xí)Python異步編程,這里將介紹異步Web框架sanic,為什么不是tornado?從框架的易用性來說,F(xiàn)lask要遠(yuǎn)遠(yuǎn)比tornado簡單,可惜flask不支持異步,而sanic就是類似Flask語法的異步框架。
github:https://github.com/huge-success/sanic
不過sanic對環(huán)境有要求:
- macOS/linux
- python 3.6+
不過,我在macOS上安裝 sanic 還是踩了坑。依賴庫ujson
一直安裝失敗。最后不得不卸載官方python,安裝 miniconda(第三方Python安裝包,集成了一些額外的工具)。
安裝 sanic
> pip3 install sanic
sanic 開發(fā)第一個例子
編寫官方的第一個例子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)
運(yùn)行上面的程序:
> 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/
請求堵塞
針對上面的例子,假設(shè)test()
視圖函數(shù)的處理需要5秒鐘,那么請求就堵塞了。
from time import sleep app = Sanic(name="pyapp") @app.route('/') async def test(request): sleep(5) return json({'hello': 'world'})
重啟服務(wù),通過瀏覽器發(fā)送請求,我們發(fā)現(xiàn)請求耗時5秒,這顯然對用戶就不能忍受的。
異步非堵塞
所以,我們要實現(xiàn)異步調(diào)用,修改后的完整代碼如下:
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)
關(guān)于python異步的使用參考上一篇文章,重新啟動服務(wù)。這次前端就不在堵塞了。
如果看 sanic 的運(yùn)行日志:
[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
他仍然在執(zhí)行,但不會堵塞test()
視圖函數(shù)的響應(yīng)。
思考:假如我的需求是:請求之后先告訴我已經(jīng)處理了,然后默默的去處理,什么時候處理來再主動把處理的結(jié)果告訴。那么這就需要用到 websocket了。
到此這篇關(guān)于python異步Web框架sanic的實現(xiàn)的文章就介紹到這了,更多相關(guān)python 異步 sanic內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于生產(chǎn)消費者模型中task_done()的具體作用
這篇文章主要介紹了關(guān)于生產(chǎn)消費者模型中task_done()的具體作用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02Django2.1.7 查詢數(shù)據(jù)返回json格式的實現(xiàn)
這篇文章主要介紹了Django2.1.7 查詢數(shù)據(jù)返回json格式的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12plt.figure()參數(shù)使用詳解及運(yùn)行演示
這篇文章主要介紹了plt.figure()參數(shù)使用詳解及運(yùn)行演示,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01TensorFlow搭建神經(jīng)網(wǎng)絡(luò)最佳實踐
這篇文章主要為大家詳細(xì)介紹了TensorFlow搭建神經(jīng)網(wǎng)絡(luò)最佳實踐,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03