Ссылка Прервать все asyncio.sleep, выполняющиеся в настоящее время
Кредиты на { ссылка } для кода асинхронности.
Вы можете добавить эту функцию (Винсент):
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()
, или он будет не работает.
Теперь проблема, с которой мы сталкиваемся сейчас, заключается в том, что с этим кодом; мы отменяем все таймеры; что, конечно, не то, что мы хотим, поскольку будут очевидные конфликты. Как вы могли go сделать это, зависит только от вас; но вы можете попытаться добавить идентификатор в функцию сна, которая хранится в userID. Это действительно зависит от вас, но это теория и основной код c.