背景關系:我正在制作一個不和諧的機器人,并且靜音命令帶有一個持續時間說明符,用于指示用戶何時應該再次取消靜音(這是通過為用戶分配一個角色來洗掉他們發送訊息的能力來完成的)。
想法 1:我可以創建一個回圈,例如每 30 秒檢查一次并查看哪些靜音已過期并取消它們。
想法 2:每次處理靜音時,我可以await asyncio.sleep(however long)然后取消它。
我想問 - 哪個更地道,更重要的是,哪個更有效?第一個的優點是它只運行一個協程,而最后一個為每個單獨的案例生成一個新的協程(我真的不知道可能有多少,但假設最多大約 10 個并發案例)。然而,最后一個對我來說更容易實作并且感覺更像是一個更直接的解決方案,除了讓取消靜音準時發生而不是在定時回圈上發生。
有一個想法是創建一個回圈,等待下一個任務,然后當它處理該任務時,將下一個任務排隊,但是你不能在佇列的前面插入任務。
TL;DR - 如果我需要安排多個事件,我是運行一個回圈來不斷檢查調度程式,還是為每個事件打開一個協程await asyncio.sleep(however long)?
uj5u.com熱心網友回復:
您的第二個想法似乎是最準確和直接的,因為您可以asyncio.create_task在一段時間后簡單地使用它來運行取消靜音的協程。通過使用asyncio.create_task,您不需要return或yield支持取消靜音協程以供gather稍后編輯或提交以按既定時間間隔由回圈檢查,因為awaiting 回傳的回應asyncio.create_task將在后臺運行任務:
import asyncio
async def unmute(delay, user_id):
await asyncio.sleep(delay)
#run unmute process
async def mute(user_id):
#your mute function
mute_for = await do_mute(user_id) #some mute function
u = asyncio.create_task(unmute(umute_for, user_id))
await u #submitting the task to be run in the background
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/386090.html
