首页 > 解决方案 > Python Discord Bot - 命令并发

问题描述

我目前正在为我的服务器实施 Discord Bot,但遇到了一点并发问题。

一、目标:

在 Discord 上触发特定命令后,机器人应该发送一条用于“投票目的”的消息。它发送消息,添加一个喜欢和不喜欢的反应并等待其他三个喜欢(或在 15 秒后停止)。之后,它会回复原始消息(命令触发器)。

问题:

如果我运行此命令两次(或更多),而他们都在等待反应,如果我喜欢其中一个,它还会将“喜欢计数”添加到第二个。

我假设discord.py-rewrite会并行运行同一命令的多次执行,而不会相互交互。这个假设不正确吗?还是问题出在这段特定的代码中?

我在Stackoverflow读过 asyncio不是线程安全的,但我也读过它是。

有没有办法解决这个问题?我该如何解决这个问题?

先感谢您。

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()

标签: pythonconcurrencydiscorddiscord.py-rewrite

解决方案


推荐阅读