微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

异步计时器函数在被调用两次时会自行阻塞

如何解决异步计时器函数在被调用两次时会自行阻塞

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

这是我的功能

async def messageCountdown(context,message,counter):

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

    for i in range(counter,-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应该可以解决问题,但显然不是。另外,我不明白为什么一个函数会阻止相反的函数,因为异步和时间都不会这样做,因为该函数是异步的(这应该完全阻止了现在发生的事情,不是吗?)。

解决方法

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

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

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

详细了解Discord API速率限制:here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。