【问题标题】:Async timer function blocks itself when called twice异步计时器函数在调用两次时会自行阻塞
【发布时间】:2020-12-16 16:30:00
【问题描述】:

我目前正在尝试为我的 Discord Bot 实现一个功能,我可以在设定的几秒钟后轻松删除发送的消息。

这是我的功能:

async def messageCountdown(context, message, counter):

    response = await context.send(f"**{'—' * counter}** \n {message}")

    for i in range(counter, 0, -1):
        await response.edit(content=f"**{'—' * i}** \n {message}")
        await asyncio.sleep(1)
    
    await context.message.delete()
    await response.delete()

函数调用:

@client.command()
async def test(context, *message):
    await messageCountdown(context, "Test", 10)

如果只调用一次,函数本身就可以运行得很好: https://gyazo.com/3b1eef9ecf8ecbe6473e8b20dfcd19d1
一旦我调用它两次或更多次,倒计时就会以一种奇怪的方式不一致:https://gyazo.com/af4b23c5831ae90d5bc5a8461a22b0d7

我再次尝试了相同的操作,但将await asyncio.sleep(1) 替换为time.sleep(1),结果相同。 这是我不知道如何继续的地方,因为我发现asyncio 应该可以解决问题,但显然不能。另外,我不明白为什么一个函数会阻塞相反的函数,因为 asyncio 和 time 都不应该这样做,因为该函数是异步的(这应该完全阻止现在发生的事情,不是吗?)。

【问题讨论】:

    标签: python asynchronous async-await discord.py


    【解决方案1】:

    这里的async函数没有问题。问题是 Discord API 速率限制

    您调用该函数两次,因此它每秒编辑消息两次而不是一次。

    一旦您达到速率限制,机器人就会执行此操作,但由于速率限制而尚未更新,一旦移除速率限制,它会立即更新消息,从而使其从第 3 步跳到第 1 步直接导致消息更新不一致。

    阅读有关 Discord API 速率限制的更多信息:here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2017-09-17
      相关资源
      最近更新 更多