python async - 休眠多个协程的效率

python async - efficiency of sleeping multiple coroutines

上下文:我正在制作一个不和谐的机器人,静音命令带有一个持续时间说明符,用于指示用户何时应该再次取消静音(这是通过分配角色来完成的给取消发送消息能力的用户)。

想法 1:我可以制作一个循环,每隔 30 秒检查一次,然后查看哪些静音已过期并取消它们。

思路2:每次处理一个静音,我都可以await asyncio.sleep(however long)然后取消

我想问 - 哪个更地道,更重要的是,哪个更有效率?第一个的优点是它只有一个协程 运行ning 而最后一个为每个单独的案例生成一个新的协程(我真的不知道可能有多少,但假设大约有 10 个并发案例最大限度)。然而,最后一个对我来说更容易实现并且感觉更像是一个更直接的解决方案,除了让取消静音准确地按时发生而不是在定时循环上。

有一种想法是创建一个循环,等待下一个任务,然后在处理该任务时,将下一个任务排队,但是您不能将任务插入队列的前面。

TL;DR - 如果我需要安排多个事件,我是 运行 一个循环来不断检查调度程序,还是为每个事件打开一个协程只是 await asyncio.sleep(however long) 他们每个人?

你的第二个想法似乎是最准确和直接的,因为你可以在一定时间后简单地使用 asyncio.create_task 到 运行 取消静音协程。通过使用 asyncio.create_task,您不需要 returnyield 返回取消静音协程以便稍后 gathered 或提交它以按既定时间间隔进行循环检查,对于 awaitasyncio.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(mute_for, user_id))
  await u #submitting the task to be run in the background