在傳統的同步程式設計裡,假設Bot執行 !build_status 指令,要查詢建置的狀態,這時候整個 Bot 會被卡住等 GitHub API 回應。而等待的這幾秒內其他伺服器的使用者完全沒辦法用其他指令,整個系統就像暫時當機一樣,對一個專業的 DevOps 工具來說,這樣的體驗完全是不行的
因此非同步程式設計的核心就在於:當 Bot 等待外部 API 回應時,它不會閒置,而是可以同時處理多項任務,比如在等待 CI/CD 管道運行的同時,可以處理程式碼審查、基礎設施配置等多項任務
整體程式碼遵循著 「事件循環」(Event Loop) 這樣的機制在運作:
假設當用戶A在A頻道執行 !build_status 指令,同時用戶B也在B頻道下了另個指令,這時事件循環會先處理 A 的請求,一旦遇到需要等網路回應的地方,就立刻切去處理 B 的請求。整個過程看起來就像兩個指令同時被執行一樣,提升Bot的回答速度
在 Bot 的程式碼裡,可以看出很頻繁的用到async def 和 await 這兩個關鍵字,它們其實就是非同步程式設計的核心
async def build_status(ctx):
wait_msg = await ctx.send("🔄 正在查詢建置狀態...")
status_message = await get_latest_build_status()
await wait_msg.edit(content=status_message)
當程式執行到 await get_latest_build_status() 時,就相當於BOT在告訴自己先不要在這裡乾等,先去處理其他訊息,有結果的時候再回來就好
非同步設計帶來的使用者體驗提升