python async - 休眠多个协程的效率
Posted
技术标签:
【中文标题】python async - 休眠多个协程的效率【英文标题】:python async - efficiency of sleeping multiple coroutines 【发布时间】:2022-01-21 07:08:10 【问题描述】:上下文:我正在制作一个不和谐的机器人,并且静音命令带有一个持续时间说明符,用于指示用户何时应该再次取消静音(这是通过为删除的用户分配一个角色来完成的他们发送消息的能力)。
想法 1:我可以创建一个循环,例如每 30 秒检查一次,并查看哪些静音已过期并取消它们。
想法2:每次处理静音,我可以await asyncio.sleep(however long)
然后取消。
我想问一下——哪个更惯用,更重要的是,哪个更有效率?第一个的优点是它只运行一个协程,而最后一个为每个单独的案例生成一个新的协程(我真的不知道可能有多少,但假设最多有 10 个并发案例)。然而,最后一个对我来说更容易实现并且感觉是一个更直接的解决方案,除了让取消静音完全按时而不是在定时循环上发生。
有一个想法是创建一个循环,等待下一个任务,然后在处理该任务时,将下一个任务排队,但是你不能在队列的前面插入任务。
TL;DR - 如果我需要安排多个事件,我是运行一个循环来不断检查调度程序,还是为每个事件打开一个协程并且只为 await asyncio.sleep(however long)
每个事件打开一个协程?
【问题讨论】:
【参考方案1】:您的第二个想法似乎是最准确和最直接的,因为您可以简单地使用asyncio.create_task
在一定时间后运行取消静音协程。通过使用asyncio.create_task
,您不需要return
或yield
将取消静音协程返回到gather
ed 或提交它以在已建立的时间间隔由循环检查,因为await
ing 返回来自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(mute_for, user_id))
await u #submitting the task to be run in the background
【讨论】:
以上是关于python async - 休眠多个协程的效率的主要内容,如果未能解决你的问题,请参考以下文章
python 异步 async/await -1.一文理解什么是协程