江湖小白之進階篇 (三)實現Sanic異步非阻塞並行請求

      隨着副業如火如荼的進行,給我們這些掙扎在底層的人們極大的改善了生活條件,感謝政府,感謝黨,開展副業的同時也不能忘記自己的老本行,利用抽會兒煙的時間,接着上篇來實現Sanic異步非阻塞並行請求。

      我們在Sanic框架中請求訪問的時候發現是一些問題,意思就是當你發起第一個請求的時候,在請求中你加入了類似time.sleep(5)阻塞主線程的方法,你同時又去發起第二個請求,但第二個請求要等待第一個請求結束後也就是5秒後才執行,那萬一第一個請求執行的時間過長,那其它請求就在苦苦等待,這在正式的操作環境中是不允許的,那我們怎麼解決這個,接下來就是我們要實現的異步非阻塞請求,我們便於測試先創建一個名爲test.py的測試文件,看下正常的執行方法:

# coding:utf-8
import time
from sanic import Sanic
from sanic.response import text

# 初始化
app = Sanic(__name__)

async def task_sleep():
    while True:
        time.sleep(5)
        print("執行中……")

# 定義路由實現首頁顯示
@app.route("/")
async def index(request):
    await task_sleep()
    return text("你好,美女!")


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000, debug=True)

我們添加一個task_sleep的方法,方法中我們加入了延遲5秒,在首頁方法函數中引入,這裏要注意的是要引入異步函數,我們在前面要加個await,我們運行看看,打開瀏覽器開發者工具:

大家可以看到,在這個請求中一直在等待當中,這顯然不是我們想要的,那我們根據官方的方法改動下:

# 定義路由實現首頁顯示
@app.route("/")
async def index(request):
    app.add_task(task_sleep())
    return text("你好,美女!")

add_task:官方的解釋是在循環開始後,安排任務稍後運行。你可以理解將task_sleep方法放到了後臺執行,我們運行看看結果:

可以看到通過上面的修改就實現了請求的異步執行,那問題又來了,這樣看着貌似很完美,但我們發現如果同時執行2個請求,我們會發現,第二個請求一直在請求等待中,無法達到接口並行請求:

那這個問題怎麼處理呢,通過查看一些資料和方法,可能水平有限,沒發現sanic本身有什麼方法能處理,其它的處理方式都是使用了asyncio庫,我們這樣修改下:

# coding:utf-8
import time,asyncio
from sanic import Sanic
from sanic.response import text

# 初始化
app = Sanic(__name__)

async def task_sleep():
    while True:
        await asyncio.sleep(5)
        print("執行中……")

# 定義路由實現首頁顯示
@app.route("/")
async def index(request):
    app.add_task(task_sleep())
    return text("你好,美女!")


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000, debug=True)

使用 await asyncio.sleep(5)來替代time.sleep(5),來,我們繼續測試看下:

控制檯打印:

這樣我們就實現了異步非阻塞並行的請求,嗯感覺很完美,這裏你可能不會發現,但在實際的開發過程中,你會發現這裏是用asyncio.sleep(5)實現延遲來測試後臺任務,那在實際開發中,比如說我們提取PDF有100多頁,這個執行的過程可能要花數分鐘的時間,我們在這個PDF處理的方法中並沒有加入sleep()延遲這類的方法,那我們怎樣讓這個方法在後臺運行而且能實現並行的請求而不阻塞呢?

這裏會用到asyncio中的ensure_future方法,這裏我們就先提及一下這個問題,在後面的調用提取PDF的方法中我們會用到這個,這裏我發個對比圖看下大家就能明白:

未並行處理 並行處理

從上面的運行結果看,第一個是等任務執行完成後纔去執行加載圖片請求的訪問,第二個很明顯是並行請求接口,一邊獲取一邊加載圖片。

好了,今天對Sanic異步非阻塞並行請求的實現方法就介紹到這裏,下一節來實現websocket服務的搭建。

開始要爲晚上的地攤生意做準備了,歡迎廣大人民羣衆提供一些喜歡的需求物品清單。

沒有做不到,只有想不到。江湖不說再見,咱們下篇見!

關注公衆號,超越平凡才能成就自我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章