我有一個命令可以發送遵循相同結構的多種型別的訊息,但我正在使用幫助功能來發送訊息。為簡單起見,我的代碼如下所示:
選項1:
async def helper(context: Context, msg_type: str, param1, param2, ...):
# Some code to create the message to be sent ...
embed = discord.Embed(description=message)
await context.send(embed=embed)
@commands.hybrid_command(
name="run",
description="Sends a reminder to run."
)
def run(context: Context, param1, param2, ...):
# Some input validation for run command ...
helper(context, 'run', param1, param2, ...)
@commands.hybrid_command(
name="walk",
description="Sends a reminder to walk."
)
def walk(context: Context, param1, param2, ...):
# Some input validation for walk command ...
helper(context, 'walk', param1, param2, ...)
選項 2 使每個函式異步并使用 await 呼叫助手。
這是我第一次創建一個不和諧的機器人并使用 async/await。我已經讀過 async/await 的經驗法則是在需要等待某些計算的地方使用 async,特別是如果它像 API 一樣在您的代碼之外。
- 我希望得到一些指導,以了解我應該或不應該在我的不和諧機器人中或一般情況下使用 async/await 的位置。為了效率起見,假設這個機器人將由 100k 用戶執行(如果需要考慮的話),并且輔助函式還涉及呼叫不和諧以外的 API。
- 我只找到 1 個命令 = 1 個動作的機器人命令方法,是否有實施組合命令的建議?也許我的命令應該改為使用訊息型別作為第一個命令來呼叫我的輔助函式(比如 /send run 或 /send walk)?
uj5u.com熱心網友回復:
選項 1 是個壞主意。您應該始終 await使用異步函式(除非您main別無選擇,只能使用asyncio庫之類的東西來啟動它,但這不適用于這里)。
換句話說,選項 2 是要走的路。你唯一需要改變的是在你的命令回呼前面添加一個額外的詞,所以它對你作為開發人員沒有任何影響。此外,這將允許您呼叫其他非常有用的異步函式。完全沒有理由不選擇選項 2。
我希望得到一些指導,以了解我應該或不應該在我的不和諧機器人中或一般情況下使用 async/await 的位置。
您應該盡可能使用它,但主要用于可能需要幾秒鐘(如果不是更多)的慢速部分。如果您的機器人中的所有內容都是同步的,那么您的整個機器人將凍結,直到命令完成。如果要由“100k 個用戶”執行,想象一下 100k 個命令排在佇列中,因為每個命令都必須一個接一個地執行。您的機器人實際上會連續凍結幾分鐘。
有關“阻止”的更多資訊,請閱讀 Discord.py 檔案:https ://discordpy.readthedocs.io/en/stable/faq.html#what-does-blocking-mean
基本上:如果你可以讓它異步,你沒有理由不讓它異步。您永遠不必考慮“我應該讓這部分異步嗎?” 答案幾乎總是“是”。
并且輔助函式還涉及呼叫不和諧以外的 API。
API 呼叫應始終是異步的。一個請求最多可能需要幾秒鐘。如果您的機器人有 100k 用戶,并且只有 100 個用戶 (0.1%) 同時運行該命令,那么您的機器人將在數百秒內完全沒有回應。關于阻塞的檔案頁面已經解釋了如何進行異步 API 呼叫。
想象一下,如果我使用一個命令向一個非常慢的服務器發出 API 請求。你認為你的 100.000 多個用戶會因為一個人呼叫一個命令而恰好發出一個緩慢的請求而讓你的整個機器人在 30 秒內無回應嗎?
同樣的概念也適用于資料庫互動。擁有數十萬用戶,查詢將不可避免地開始放緩。您不希望您的機器人也變得慢得無法忍受,因為它花費 95% 的時間等待資料庫查詢完成,對嗎?
我只找到 1 個命令 = 1 個動作的機器人命令方法,是否有實施組合命令的建議?
不完全確定你的意思 - 你愿意更詳細地解釋一下嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517866.html
