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,您不需要returnyield 将取消静音协程返回到gathered 或提交它以在已建立的时间间隔由循环检查,因为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(mute_for, user_id))
  await u #submitting the task to be run in the background

【讨论】:

以上是关于python async - 休眠多个协程的效率的主要内容,如果未能解决你的问题,请参考以下文章

python 异步 async/await -1.一文理解什么是协程

Lua-Async 协程的高级用法

Python 协程详解

asyncio 异步编程

python asyncio 异步 I/O - 协程(Coroutine)与运行

协程的优点(Python)