Python Discord Bot - командный параллелизм - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время я внедряю 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()
...