В настоящее время я внедряю Discord Bot для своего сервера и столкнулся с небольшой проблемой параллелизма.
Сначала цель:
После запуска определенной команды на Discord бот должен отправить сообщение для «голосования». Он отправляет сообщение, добавляет реакцию «нравится» и «не нравится» и ждет трех других лайков (или останавливается через 15 секунд). После этого он отвечает реакцией на исходное сообщение (триггер команды).
Проблема:
Если я запускаю эту команду дважды (или более), в то время как они оба ждут реакции, если мне нравится один из них, он также добавляет «как счет» ко второму.
Я предположил, что discord.py -rewrite будет запускать несколько выполнений одной и той же команды параллельно, не взаимодействуя друг с другом. Это предположение неверно? Или проблема l ie в этом конкретном фрагменте кода?
Я прочитал вокруг Stackoverflow , что asyncio не является поточно-ориентированным, но я также читал, что это так.
Есть ли способ обойти это? Как я мог go решить эту проблему?
Заранее спасибо.
PS: Все операции импорта выполнены, и все работает, если команда выполняется только один раз за один раз
@client.command()
@commands.cooldown(1, 2, commands.BucketType.guild)
async def flames(ctx, *, msg):
msg = await ctx.send(f'blah? (15sec to vote)\n```{msg}```')
await msg.add_reaction('?')
await msg.add_reaction('?')
reaction = None
try:
while reaction == None or \
(str(reaction.emoji) != '?' and reaction.count <= 3):
reaction, user = await client.wait_for('reaction_add', timeout=15.0)
except asyncio.TimeoutError:
await msg.delete()
await sendTempMsg(ctx, 3, f'{ctx.message.author.mention} denied.')
await ctx.message.add_reaction('?')
else:
await msg.delete()
await sendTempMsg(ctx, 3, f'{ctx.message.author.mention} approved!')
await ctx.message.add_reaction('?')
async def sendTempMsg(ctx, time, msg):
tempMsg = await ctx.send(msg)
await asyncio.sleep(time)
await tempMsg.delete()