如何取消 discord.py 中的 asyncio.sleep 命令
Posted
技术标签:
【中文标题】如何取消 discord.py 中的 asyncio.sleep 命令【英文标题】:How to cancel asyncio.sleep commands in discord.py 【发布时间】:2020-06-23 22:51:29 【问题描述】:我的机器人中有一个计时器命令,它使用 asyncio.sleep。如果用户愿意,我想发出一个命令来取消计时器。
@bot.command()
async def timer(ctx, time: int):
await ctx.send('Timer set for ' + str(time) + ' seconds')
await asyncio.sleep(time)
await ctx.send('Time over!')
有没有办法这样做,(我更喜欢不创建新文件的方法,在同一个文件中进行)
【问题讨论】:
【参考方案1】:引用Interrupt all asyncio.sleep currently executing
感谢https://***.com/users/2846140/vincent 的异步代码。
您可以添加此功能(由 vincent 提供):
def make_sleep():
async def sleep(delay, result=None, *, loop=None):
coro = asyncio.sleep(delay, result=result, loop=loop)
task = asyncio.ensure_future(coro)
sleep.tasks.add(task)
try:
return await task
except asyncio.CancelledError:
return result
finally:
sleep.tasks.remove(task)
sleep.tasks = set()
sleep.cancel_all = lambda: sum(task.cancel() for task in sleep.tasks)
return sleep
在这种情况下的用法是:
@bot.command()
async def timer(ctx, time: int):
await ctx.send('Timer set for ' + str(time) + ' seconds')
await sleep(time)
await ctx.send('Time over!')
@bot.command()
async def canceltimers(ctx):
sleep.cancel_all()
await asyncio.wait(sleep.tasks)
await ctx.send('Timers cancelled')
您的bot.run(token)
将放在sleep = make_sleep()
之前的位置,否则它将不起作用。
现在,我们现在面临的问题是这段代码;我们取消所有的计时器;这当然不是我们想要的,因为会有明显的冲突。你如何去做这完全取决于你。但是您可以尝试在由 userID 存储的 sleep 函数中添加一个标识符。这完全取决于您,但这是其背后的理论和基本代码。
【讨论】:
以上是关于如何取消 discord.py 中的 asyncio.sleep 命令的主要内容,如果未能解决你的问题,请参考以下文章